乐乐2365 发表于 2015-8-9 23:30 static/image/common/back.gif
把正确的收到hex保存起来,如果错误,你必须丢弃。这个程序我不会,大侠指点
我又来了。。。
既然我一直在回复你的帖子,你为何不能去搜索一下我的帖子呢?或许我在某个帖子里边有提问过,有解决方案?struct engineData {
float RPM;
float MAP;
float TPS;
float ECT;
float IAT;
float O2S;
float SPARK;
float FUELPW1;
float FUELPW2;
float UbAdc;
} data;
const uint8_t preamble[] = {0x80, 0x8F, 0xEA, 0x16, 0x50, 0x08};
uint8_t buf;
uint8_t commPointer = 0;
int checkSum() {
for (int i = 0; i < 26; i++)
{
buf += buf;
}
if (buf == buf)
{
return 1;
}
else
{
return 0;
}
}
void produceData() {
data.RPM = (buf * 256 + buf) / 4;
data.MAP = (buf * 256 + buf) / 256;
data.TPS = (buf * 256 + buf) / 655.36;
data.ECT = (buf * 256 + buf) - 40;
data.IAT = (buf * 256 + buf) - 40;
data.O2S = (buf * 256 + buf) / 204.8;
data.SPARK = (buf * 256 + buf) / 2;
data.FUELPW1 = (buf * 256 + buf) / 1000;
data.FUELPW2 = (buf * 256 + buf) / 1000;
data.UbAdc = (buf * 256 + buf) / 160;
}
void printData() {
Serial.print("New Data\n");
Serial.print(data.RPM);
Serial.print("\n");
Serial.print(data.MAP);
Serial.print("\n");
Serial.print(data.TPS);
Serial.print("\n");
Serial.print(data.ECT);
Serial.print("\n");
Serial.print(data.IAT);
Serial.print("\n");
Serial.print(data.O2S);
Serial.print("\n");
Serial.print(data.SPARK);
Serial.print("\n");
Serial.print(data.FUELPW1);
Serial.print("\n");
Serial.print(data.FUELPW2);
Serial.print("\n");
Serial.print(data.UbAdc);
Serial.print("\n");
}
void setup()
{
Serial.begin(115200);
Serial.println("System Int OK");
}
void loop()
{
if (Serial.available() > 0)
{
uint8_t incomingByte = Serial.read();
if (commPointer < 6 && (preamble == incomingByte))
{
buf = incomingByte;
commPointer++;
}
else if ((commPointer > 5) && (commPointer < 27))
{
buf = incomingByte;
commPointer++;
}
else if (commPointer == 27 && checkSum())
{
buf=00;
produceData();
printData();
commPointer = 0;
}
else
commPointer = 0;
}
}
上边的代码,是我在网上抄来的。调试通过之后,学习了它的工作方式,然后写了自己的另外的代码(自己写的代码不能给你)
if (Serial.available() > 0)//如果串口事件发生
{
uint8_t incomingByte = Serial.read();//读取一个字节到变量
if (commPointer < 6 && (preamble == incomingByte))//判断:字节计数小于6并且收到的字节和预置字节相同位置内容一致
{//如果一致,执行以下代码
buf = incomingByte;//保存收到的当前字节到自定义缓冲区
commPointer++;//字节计数增加
}
//如果字节计数不小于5或者收到的内容不等于预置内容就执行下边
else if ((commPointer > 5) && (commPointer < 27))//判断:字节计数大于5并且小于27(27是自定义缓冲区大小)
{
buf = incomingByte;//保存收到的字节到缓冲区
commPointer++;//字节计数增加
}
//如果字节计数已经=27,则证明已经接受完一条协议。
else if (commPointer == 27 && checkSum())//判断:如果字节计数=27并且计算校验和正确
{
buf=00;//自定义缓冲区第28位置零,准备给下一次数据计算校验码临时存放
produceData();//分割数据包
printData();//输出数据
commPointer = 0;//重置字节计数值
}
else//如果以上主要判断条件均不正确,直接重置字节计数值
commPointer = 0;
} 你要根据各个if的条件,慢慢理顺代码执行的顺序。你才能理解我给你的代码的编程思想。你才能把我的这个思路用到你自己的代码里边去。
liuxue4503 发表于 2015-8-10 10:22 static/image/common/back.gif
我现在刚好也在弄一个串口通信的小东西。
收到并保存这个,一种方法是:
在外面设一个标志位,来确定是 ...
为什么添加这个程序上边的对比程序不管用了
else
{
if (buttonState == LOW)
{
delay(10);
if (buttonState == LOW)//机械式延时去抖
j++;//按键后变量加1;
while(!digitalRead(addKey));//等待松开按键结束,按键弹起算一次有效值
}
液晶屏串口程序
int incomingByte =0;
int ledpin = 8; //定义数字接口
unsigned char HEXFD1 = {0xA5, 0x5A, 0x06, 0x83, 0x00,0x00, 0x01,0x00, 0x01};
unsigned char HEXFD2 = {0xA5, 0x5A, 0x06, 0x83, 0x00,0x00, 0x01,0x00, 0x02};
unsigned char HEXFD3 = {0xA5, 0x5A, 0x06, 0x83, 0x00,0x00, 0x01,0x00, 0x03};
unsigned char HEXFD4 = {0xA5, 0x5A, 0x06, 0x83, 0x00,0x00, 0x01,0x00, 0x04};
unsigned char HEXFD5 = {0xA5, 0x5A, 0x06, 0x83, 0x00,0x00, 0x01,0x00, 0x05};
unsigned char HEXFD6 = {0xA5, 0x5A, 0x06, 0x83, 0x00,0x00, 0x01,0x00, 0x06};
unsigned char HEXFD7 = {0xA5, 0x5A, 0x06, 0x83, 0x00,0x00, 0x01,0x00, 0x07};
unsigned char HEXFD8 = {0xA5, 0x5A, 0x06, 0x83, 0x00,0x00, 0x01,0x00, 0x08};
unsigned char HEXFD9 = {0xA5, 0x5A, 0x06, 0x83, 0x00,0x00, 0x01,0x00, 0x09};
unsigned char HEXFD10 = {0xA5, 0x5A, 0x06, 0x83, 0x00,0x00, 0x01,0x00, 0x0A};
int j=0;//初使化加数变量
int addKey =4;//定义按键为第4引脚
int buttonState = 0; //初使化按键暂存值,为了和addKey类型保持一致用int;
unsigned char showNumber ={
{0xA5,0x5A,0x05,0x82,0x00,0x10,0x00,0x01},
{0xA5,0x5A,0x05,0x82,0x00,0x10,0x00,0x02},
{0xA5,0x5A,0x05,0x82,0x00,0x10,0x00,0x03},
{0xA5,0x5A,0x05,0x82,0x00,0x10,0x00,0x04},
{0xA5,0x5A,0x05,0x82,0x00,0x10,0x00,0x05},
{0xA5,0x5A,0x05,0x82,0x00,0x10,0x00,0x06},
{0xA5,0x5A,0x05,0x82,0x00,0x10,0x00,0x07},
{0xA5,0x5A,0x05,0x82,0x00,0x10,0x00,0x08},
{0xA5,0x5A,0x05,0x82,0x00,0x10,0x00,0x09},
{0xA5,0x5A,0x05,0x82,0x00,0x10,0x00,0x0A}};
int x = 0;
int CheckSumX1 = 0;
int CheckSumX2 = 0;
int CheckSumX3 = 0;
int CheckSumX4 = 0;
int CheckSumX5 = 0;
int CheckSumX6 = 0;
int CheckSumX7 = 0;
int CheckSumX8 = 0;
int CheckSumX9 = 0;
int CheckSumX10 = 0;
void setup()
{
Serial.begin(9600);
pinMode(ledpin, OUTPUT);
pinMode(addKey,INPUT);
}
void loop()
{
// Serial.write(hexdata,7);
buttonState = digitalRead(addKey);//
if (Serial.available() > 0)
{
incomingByte = Serial.read();
Serial.print(incomingByte, HEX);
if (HEXFD1 == incomingByte) {
CheckSumX1++;
}
if (HEXFD2 == incomingByte) {
CheckSumX2++;
}
if (HEXFD3 == incomingByte) {
CheckSumX3++;
}
if (HEXFD4 == incomingByte) {
CheckSumX4++;
}
if (HEXFD5 == incomingByte) {
CheckSumX5++;
}
if (HEXFD6 == incomingByte) {
CheckSumX6++;
}
if (HEXFD7 == incomingByte) {
CheckSumX7++;
}
if (HEXFD8 == incomingByte) {
CheckSumX8++;
}
if (HEXFD9 == incomingByte) {
CheckSumX9++;
}
if (HEXFD10 == incomingByte) {
CheckSumX10++;
}
x++;
if (x == 9) {
if (CheckSumX5 == 9) {
digitalWrite(ledpin, HIGH); //点亮数字13 口LED。
delay(5000);
}
if (CheckSumX7 == 9) {
digitalWrite(ledpin, LOW); //熄灭数字13 口LED
delay(5000);
}
x = 0;
CheckSumX5 = 0;
CheckSumX7 = 0;
}
}
else
{
if (buttonState == LOW)
{
delay(10);
if (buttonState == LOW)//机械式延时去抖
j++;//按键后变量加1;
while(!digitalRead(addKey));//等待松开按键结束,按键弹起算一次有效值
}
switch(j)
{
case 1:
Serial.write(&showNumber,8);
break;
case 2:
Serial.write(&showNumber,8);
break;
case 3:
Serial.write(&showNumber,8);
break;
case 4:
Serial.write(&showNumber,8);
break;
case 5:
Serial.write(&showNumber,8);
break;
case 6:
Serial.write(&showNumber,8);
break;
case 7:
Serial.write(&showNumber,8);
break;
case 8:
Serial.write(&showNumber,8);
break;
case 9:
Serial.write(&showNumber,8);
break;
case 10:
Serial.write(&showNumber,8);
j=0;
break;
default:
break;
}
}
}
你还是去理解一下上面maxims发的那一篇吧,那个思路是比较好用的了,我后来也搞一个类似的串口通讯的小项目,也是这样操作的,开始时间在你来这里问问题之后了。
页:
1
[2]