[讨论] 串口数据高位0一直收不到,会arduino的朋友看一下

suoma   2017-2-9 16:37 楼主
使用arduino串口接收另一设备的串口输出数据,通过串口软件观察高位0总是收不到,比如01,就只能收到1,如果是00,收到0,如下图
3.PNG
电脑单独通过串口软件(不使用arduino串口)观察接收的数据都正常,后期准备将数据存储到SD模块,
简单的串口测试程序如下,波特率匹配目标设备

  1. byte inbyte;

  2. void setup() {
  3.   // initialize serial:
  4.   Serial.begin(1200,SERIAL_8E1);

  5. }

  6. void loop() {
  7.   // if there's any serial available, read it:
  8.   while (Serial.available() > 0) {
  9.    inbyte=Serial.read();
  10.    Serial.println(inbyte,HEX);
  11.     //if (Serial.read() == '\n') {}
  12.   }
  13. }

请大家指点一下

回复评论 (17)

用串口模拟发数据,让arduino接收试试,确定是arduino的问题?
点赞  2017-2-9 16:55
串口发送有问题
天地庄周马;江湖范蠡船。 个性签名还是放QQ号吧,2060347305,添加说明EEworld好友
点赞  2017-2-9 17:35
注意测试方法,不要有电平竞争。正确测试的话,硬件上决不可能出现这个问题,而软件与监视又无关,楼主的描述也实在难弄明白。
上传了一些书籍资料,也许有你想要的:https://download.eeworld.com.cn/user/chunyang
点赞  2017-2-9 18:08
我原来写的代码,参考下吧 用的串口收与发,计算部分就不要看了,网上的
  1. #include <SoftwareSerial.h>
  2. const byte rxPin = 2;
  3. const byte txPin = 3;

  4. SoftwareSerial mySerial =  SoftwareSerial(rxPin, txPin);

  5. int incomeByte[6];
  6. int data;
  7. int z=0;
  8. int sum;
  9. unsigned long error; void setup()
  10. {

  11.      pinMode(rxPin, INPUT);
  12.      pinMode(txPin, OUTPUT);
  13.      mySerial.begin(2400);
  14.      Serial.begin(9600);
  15. }
  16. void loop()
  17. {
  18.   while (mySerial.available()>0)
  19.    {  
  20.    data = mySerial.read();
  21.        if(data == 170)
  22.        {
  23.          z=0;
  24.          incomeByte[z]=data;
  25.        }
  26.        else
  27.        {
  28.             z++;
  29.          incomeByte[z]=data;
  30.        }
  31.       
  32.        if(z==6)
  33.        {
  34.          sum=incomeByte[1]+ incomeByte[2]+ incomeByte[3] + incomeByte[4];
  35.          if(incomeByte[5]==sum && incomeByte[6]==255 )
  36.           {               
  37.                Serial.print("Data OK! ");
  38.                Serial.print(" | Vo=");
  39.                    float vo=(incomeByte[1]*256.0+incomeByte[2])/1024.0*5.00;
  40.                Serial.print(vo,2);
  41.                Serial.print("V  ");
  42.                    float v1=analogRead(A0)/1024.0*5.00;
  43.               Serial.print("/ Ao=");
  44.               Serial.print(v1,2);
  45.               Serial.print("V  | ");
  46.                    float c=vo*200;
  47.               Serial.print(c,2);
  48.               Serial.print("ug/m3 | ");
  49.               for(int k=0;k<7;k++)
  50.                    {
  51.                     Serial.print(incomeByte[k]);
  52.                     Serial.print("|");
  53.                    }
  54.               Serial.println();
  55.            }
  56.            else
  57.            {
  58.               z=0;
  59.               Serial.flush();
  60.               data='/0';
  61.               for(int m=0;m<7;m++)
  62.                     {
  63.                      incomeByte[m]=0;
  64.                     }
  65.               error++;
  66.               Serial.print(" ### This is ");
  67.               Serial.print(error);
  68.               Serial.println(" Error ###");
  69.             }
  70.            z=0;
  71.        }
  72.     }

  73. }



点赞  2017-2-9 18:23
引用: mzb2012 发表于 2017-2-9 16:55
用串口模拟发数据,让arduino接收试试,确定是arduino的问题?


使用如下模块连接arduino UART口,通过电脑串口发送数据
TB1ty1WLFXXXXaCXpXXXXXXXXXX_!!0-item_pic.jpg_400x400.jpg
当把TTL的地线拔掉时发送数据正常,接上时,发送数据如下竖列,arduino监视窗口端接收数据和串口软件相同,不是正确的发送数据
4.PNG
点赞  2017-2-9 18:42
引用: strong161 发表于 2017-2-9 18:23
我原来写的代码,参考下吧 用的串口收与发,计算部分就不要看了,网上的

看你用了软串口
点赞  2017-2-9 18:43
引用: chunyang 发表于 2017-2-9 18:08
注意测试方法,不要有电平竞争。正确测试的话,硬件上决不可能出现这个问题,而软件与监视又无关,楼主的描 ...

arduino端就只是接收另一设备的UART引脚数据
点赞  2017-2-9 18:44
检查一下你的转换模块,或者换一个试试
点赞  2017-2-9 22:54
Serial.println(inbyte,HEX);
我看楼主的问题,不就是printlen的问题,高位的0省略了而已。函数本身就是这样设计的,人家又没限定两位输出,这不能怪人家,你要自己想办法去适应这个函数,或者干脆你自己实现两位的HEX输出。
点赞  2017-2-9 23:35
引用: lcofjp 发表于 2017-2-9 23:35
Serial.println(inbyte,HEX);
我看楼主的问题,不就是printlen的问题,高位的0省略了而已。函数本身就是这 ...

即使使用Serial.print()函数还是没有高位0
点赞  2017-2-10 09:53
引用: suoma 发表于 2017-2-10 09:53
即使使用Serial.print()函数还是没有高位0

你要自己定制风格,就要自己去实现,人家提供的API不是百变星君,你想要前缀0,你要几个前缀0?有人还要4个前缀0呢怎么办,有人不想要前缀0怎么办?有人还想要前缀0x呢,有人想要小写的十六进制输出呢怎么办?

特殊需求自己实现,人家给的函数一点毛病没有。
点赞  2017-2-10 10:07
引用: strong161 发表于 2017-2-9 18:23
我原来写的代码,参考下吧 用的串口收与发,计算部分就不要看了,网上的

这个程序功能?首先为什么波特率不匹配?
sum=incomeByte[1]+ incomeByte[2]+ incomeByte[3] + incomeByte[4];
这里为什么求和?
         if(incomeByte[5]==sum && incomeByte[6]==255 )

开始定义incomeByte[6],为什么if中又会出现 incomeByte[6]==255
点赞  2017-2-10 12:36
引用: suoma 发表于 2017-2-10 12:36
这个程序功能?首先为什么波特率不匹配?
sum=incomeByte[1]+ incomeByte[2]+ incomeByte[3] + incomeBy ...

这个是通过软串口接收2400的数据 然后通过硬串9600发送到PC,至于下面的算法是因为PM2.5检测传感器的验证数据正确的算法。
点赞  2017-2-10 12:46
引用: strong161 发表于 2017-2-10 12:46
这个是通过软串口接收2400的数据 然后通过硬串9600发送到PC,至于下面的算法是因为PM2.5检测传感器的验证 ...

论坛是否分享过该作品?我看一下
点赞  2017-2-10 17:13
引用: suoma 发表于 2017-2-9 18:42
使用如下模块连接arduino UART口,通过电脑串口发送数据

当把TTL的地线拔掉时发送数据正常,接上时 ...

但是使用另一个软件发送有正常,中间每个字节加了空格
用另一个串口软件正常.PNG
点赞  2017-2-10 17:23
引用: suoma 发表于 2017-2-10 17:13
论坛是否分享过该作品?我看一下

程序就是上面的程序,这只是原来做的东西里面的一小部分,整个程序都我传上来,你看是否用得上吧!
  1. #include <SPI.h>
  2. #include <Wire.h>
  3. #include <Arduino.h>
  4. #include <MultiLCD.h>//LCD5110库
  5. #include <dht11.h>//dht11库
  6. dht11 DHT11;
  7. #define DHT11PIN 10

  8. #define MQ2PIN A0  
  9. #define noisePIN A1  

  10. #include <SoftwareSerial.h>
  11. const byte rxPin = 12;
  12. const byte txPin = 13;
  13. SoftwareSerial mySerial =  SoftwareSerial(rxPin, txPin);
  14. int incomeByte[6];
  15. int data;
  16. int z=0;
  17. int sum;

  18. /*LCD5110接法:
  19. clk  = D7     //clock
  20. din  = D6,   // data-in
  21. dc    = D5,   // data select
  22. reset = D2,   //reset
  23. sce   = D3);  // enable
  24. */

  25. //lcd5110相关
  26. LCD_PCD8544 lcd;
  27. unsigned long starttime;
  28. void setup() {

  29. //初始化LCD
  30.   lcd.begin();
  31.   lcd.clear();
  32.   lcd.setCursor(0, 0);//在第一行打印出  Environment 字符串
  33.   lcd.print("  Environment ");
  34.   lcd.setCursor(0, 1);//光标移至第2行(从0开始数算起) 第1个像素(下同)
  35.   lcd.print("Temp :     oC");//显示出温度提示(下同)
  36. // lcd.setCursor(73, 1);//光标移至第2行(从0开始数算起) 第72个像素
  37.   //lcd.print("oC");//显示出温度单位(下同)
  38.   lcd.setCursor(0, 2);
  39.   lcd.print("Humi :     %");
  40. // lcd.setCursor(79, 2);
  41. // lcd.print("%");
  42.   lcd.setCursor(0, 3);
  43.   lcd.print("MQ2  :     ppm");
  44.   //lcd.setCursor(66, 3);
  45.   //lcd.print("ppm");
  46.   lcd.setCursor(0, 4);
  47.   lcd.print("PM2.5:     ug");
  48.   //lcd.setCursor(0, 5);//光标移至第6行(从0开始数算起) 第37个像素
  49.   //lcd.print(" Best wishes");//显示出 Best wishes
  50.   lcd.setCursor(0, 5);
  51.   lcd.print("Noise:     dB");
  52.   pinMode(rxPin, INPUT);
  53.   pinMode(txPin, OUTPUT);
  54.   mySerial.begin(2400);
  55.   Serial.begin(9600);

  56. }

  57. void loop() {
  58.    float c ;
  59. while (mySerial.available()>0){

  60.     data = mySerial.read();
  61.        if(data == 170)
  62.        {
  63.          z=0;
  64.          incomeByte[z]=data;
  65.        }
  66.        else
  67.        {
  68.             z++;
  69.          incomeByte[z]=data;
  70.        }  
  71.       
  72.        if(z==6)
  73.        {
  74.          sum=incomeByte[1]+ incomeByte[2]+ incomeByte[3] + incomeByte[4];
  75.          if(incomeByte[5]==sum && incomeByte[6]==255 )
  76.           {               
  77.                    float vo=(incomeByte[1]*256.0+incomeByte[2])/1024.0*5000;   //mv
  78.                     c = vo*0.1
  79.                     7;              
  80.            }
  81.      }
  82. //串口打印出DHT11测出的温湿度数据
  83.     DHT11.read(DHT11PIN);
  84.     int dht11temp = DHT11.temperature;
  85.     Serial.print("temperature:  ");
  86.     Serial.println(dht11temp);
  87.     int dht11hum = DHT11.humidity;
  88.     Serial.print("humidity:  ");
  89.     Serial.println(dht11hum);

  90.     int MQ2 = analogRead(MQ2PIN);
  91.     int noise = analogRead(noisePIN);
  92.     Serial.print("MQ2:  ");
  93.     Serial.println(MQ2);
  94.     Serial.print("noise:  ");
  95.     Serial.println(noise/10);

  96. /***********/
  97. /****************************/

  98.         Serial.print("PM2.5:  ");
  99.         Serial.print((int)c);
  100.         Serial.println("ug/m3 ");
  101.         Serial.println();
  102.         delay(500);
  103.    
  104. /*****************************/
  105.     //lcd上显示数据
  106.     lcd.setCursor(37, 1);//光标移至第2行(从0开始数,1就是第二个) 第37个像素(下同)
  107.     lcd.print(dht11temp);//显示出温度(下同)
  108.     lcd.setCursor(37, 2);
  109.     lcd.print(dht11hum);
  110.     lcd.setCursor(37, 3);
  111.     lcd.print(MQ2);
  112.     lcd.setCursor(37, 4);
  113.     lcd.print((int)c);
  114.     lcd.setCursor(37, 5);
  115.     lcd.print(noise/10);
  116.     delay(500);
  117. /************************** */   

  118.         
  119.   }

  120.     }






1.jpg
libraries.rar (275.3 KB)
(下载次数: 16, 2017-2-11 13:40 上传)

qx.rar (1.36 KB)
(下载次数: 12, 2017-2-11 13:40 上传)

点赞  2017-2-11 13:41
引用: strong161 发表于 2017-2-11 13:41
程序就是上面的程序,这只是原来做的东西里面的一小部分,整个程序都我传上来,你看是否用得上 ...

谢谢分享学习一下
点赞  2017-2-12 16:26
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复