社区导航

 
快捷导航
  • 首页
  • 论坛
  • 查看新帖
  • 最新回复
  • 精华区
  • 社区活动
  • 联系管理员
  • 消灭零回复
  • E金币兑换
搜索
查看: 1253|回复: 17
打印 上一主题 下一主题

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

[复制链接]

2800

TA的帖子

0

TA的资源

纯净的硅(初级)

Rank: 4

跳转到指定楼层
楼主
发表于 2017-2-9 16:37:05 | 只看该作者 |只看大图 |倒序浏览 |阅读模式
使用arduino串口接收另一设备的串口输出数据,通过串口软件观察高位0总是收不到,比如01,就只能收到1,如果是00,收到0,如下图

电脑单独通过串口软件(不使用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. }
复制代码

请大家指点一下
此帖出自单片机论坛
收藏收藏 收藏干货 分享分享

回复

使用道具 举报

322

TA的帖子

1

TA的资源

一粒金砂(中级)

Rank: 2

沙发
发表于 2017-2-9 16:55:02 | 只看该作者
用串口模拟发数据,让arduino接收试试,确定是arduino的问题?

点评

使用如下模块连接arduino UART口,通过电脑串口发送数据 [attachimg]281945[/attachimg] 当把TTL的地线拔掉时发送数据正常,接上时,发送数据如下竖列,arduino监视窗口端接收数据和串口软件相同,不是正确的发  详情 回复 发表于 2017-2-9 18:42

回复

使用道具 举报

1180

TA的帖子

4

TA的资源

纯净的硅(中级)

Rank: 5Rank: 5

板凳
发表于 2017-2-9 17:35:35 | 只看该作者
串口发送有问题
天地庄周马;江湖范蠡船。
个性签名还是放QQ号吧,2060347305,添加说明EEworld好友

回复

使用道具 举报

1万

TA的帖子

146

TA的资源

版主

Rank: 6Rank: 6

技术导师勋章

4
发表于 2017-2-9 18:08:20 | 只看该作者
注意测试方法,不要有电平竞争。正确测试的话,硬件上决不可能出现这个问题,而软件与监视又无关,楼主的描述也实在难弄明白。

点评

arduino端就只是接收另一设备的UART引脚数据  详情 回复 发表于 2017-2-9 18:44
上传了一些书籍资料,也许有你想要的:http://download.eeworld.com.cn/user/chunyang

回复

使用道具 举报

2157

TA的帖子

8

TA的资源

版主

Rank: 6Rank: 6

5
发表于 2017-2-9 18:23:59 | 只看该作者
我原来写的代码,参考下吧 用的串口收与发,计算部分就不要看了,网上的
  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. }
复制代码



点评

这个程序功能?首先为什么波特率不匹配? sum=incomeByte[1]+ incomeByte[2]+ incomeByte[3] + incomeByte[4]; 这里为什么求和? if(incomeByte[5]==sum && incomeByte[6]==255 ) 开始定义incomeByte  详情 回复 发表于 2017-2-10 12:36
看你用了软串口  详情 回复 发表于 2017-2-9 18:43

回复

使用道具 举报

2800

TA的帖子

0

TA的资源

纯净的硅(初级)

Rank: 4

6
 楼主| 发表于 2017-2-9 18:42:26 | 只看该作者
mzb2012 发表于 2017-2-9 16:55
用串口模拟发数据,让arduino接收试试,确定是arduino的问题?


使用如下模块连接arduino UART口,通过电脑串口发送数据

当把TTL的地线拔掉时发送数据正常,接上时,发送数据如下竖列,arduino监视窗口端接收数据和串口软件相同,不是正确的发送数据

点评

但是使用另一个软件发送有正常,中间每个字节加了空格 [attachimg]282120[/attachimg]  详情 回复 发表于 2017-2-10 17:23

回复

使用道具 举报

2800

TA的帖子

0

TA的资源

纯净的硅(初级)

Rank: 4

7
 楼主| 发表于 2017-2-9 18:43:12 | 只看该作者
strong161 发表于 2017-2-9 18:23
我原来写的代码,参考下吧 用的串口收与发,计算部分就不要看了,网上的

看你用了软串口

回复

使用道具 举报

2800

TA的帖子

0

TA的资源

纯净的硅(初级)

Rank: 4

8
 楼主| 发表于 2017-2-9 18:44:31 | 只看该作者
chunyang 发表于 2017-2-9 18:08
注意测试方法,不要有电平竞争。正确测试的话,硬件上决不可能出现这个问题,而软件与监视又无关,楼主的描 ...

arduino端就只是接收另一设备的UART引脚数据

回复

使用道具 举报

322

TA的帖子

1

TA的资源

一粒金砂(中级)

Rank: 2

9
发表于 2017-2-9 22:54:27 | 只看该作者
检查一下你的转换模块,或者换一个试试

回复

使用道具 举报

4965

TA的帖子

67

TA的资源

版主

Rank: 6Rank: 6

10
发表于 2017-2-9 23:35:45 | 只看该作者
Serial.println(inbyte,HEX);
我看楼主的问题,不就是printlen的问题,高位的0省略了而已。函数本身就是这样设计的,人家又没限定两位输出,这不能怪人家,你要自己想办法去适应这个函数,或者干脆你自己实现两位的HEX输出。

点评

即使使用Serial.print()函数还是没有高位0  详情 回复 发表于 2017-2-10 09:53
EEWORLD开发板置换群:309018200,——电工们免费装β的天堂,商家勿入!加群暗号:喵

回复

使用道具 举报

2800

TA的帖子

0

TA的资源

纯净的硅(初级)

Rank: 4

11
 楼主| 发表于 2017-2-10 09:53:15 | 只看该作者
lcofjp 发表于 2017-2-9 23:35
Serial.println(inbyte,HEX);
我看楼主的问题,不就是printlen的问题,高位的0省略了而已。函数本身就是这 ...

即使使用Serial.print()函数还是没有高位0

点评

你要自己定制风格,就要自己去实现,人家提供的API不是百变星君,你想要前缀0,你要几个前缀0?有人还要4个前缀0呢怎么办,有人不想要前缀0怎么办?有人还想要前缀0x呢,有人想要小写的十六进制输出呢怎么办? 特  详情 回复 发表于 2017-2-10 10:07

回复

使用道具 举报

4965

TA的帖子

67

TA的资源

版主

Rank: 6Rank: 6

12
发表于 2017-2-10 10:07:01 | 只看该作者
suoma 发表于 2017-2-10 09:53
即使使用Serial.print()函数还是没有高位0

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

特殊需求自己实现,人家给的函数一点毛病没有。
EEWORLD开发板置换群:309018200,——电工们免费装β的天堂,商家勿入!加群暗号:喵

回复

使用道具 举报

2800

TA的帖子

0

TA的资源

纯净的硅(初级)

Rank: 4

13
 楼主| 发表于 2017-2-10 12:36: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

点评

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

回复

使用道具 举报

2157

TA的帖子

8

TA的资源

版主

Rank: 6Rank: 6

14
发表于 2017-2-10 12:46:12 | 只看该作者
suoma 发表于 2017-2-10 12:36
这个程序功能?首先为什么波特率不匹配?
sum=incomeByte[1]+ incomeByte[2]+ incomeByte[3] + incomeBy ...

这个是通过软串口接收2400的数据 然后通过硬串9600发送到PC,至于下面的算法是因为PM2.5检测传感器的验证数据正确的算法。

点评

论坛是否分享过该作品?我看一下  详情 回复 发表于 2017-2-10 17:13

回复

使用道具 举报

2800

TA的帖子

0

TA的资源

纯净的硅(初级)

Rank: 4

15
 楼主| 发表于 2017-2-10 17:13:49 | 只看该作者
strong161 发表于 2017-2-10 12:46
这个是通过软串口接收2400的数据 然后通过硬串9600发送到PC,至于下面的算法是因为PM2.5检测传感器的验证 ...

论坛是否分享过该作品?我看一下

点评

程序就是上面的程序,这只是原来做的东西里面的一小部分,整个程序都我传上来,你看是否用得上吧!  详情 回复 发表于 2017-2-11 13:41

回复

使用道具 举报

2800

TA的帖子

0

TA的资源

纯净的硅(初级)

Rank: 4

16
 楼主| 发表于 2017-2-10 17:23:43 | 只看该作者
suoma 发表于 2017-2-9 18:42
使用如下模块连接arduino UART口,通过电脑串口发送数据

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

但是使用另一个软件发送有正常,中间每个字节加了空格


回复

使用道具 举报

2157

TA的帖子

8

TA的资源

版主

Rank: 6Rank: 6

17
发表于 2017-2-11 13:41:40 | 只看该作者
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.     }



复制代码




libraries.rar (275.3 KB, 下载次数: 15)
qx.rar (1.36 KB, 下载次数: 11)

点评

谢谢分享学习一下  详情 回复 发表于 2017-2-12 16:26

回复

使用道具 举报

2800

TA的帖子

0

TA的资源

纯净的硅(初级)

Rank: 4

18
 楼主| 发表于 2017-2-12 16:26:33 | 只看该作者
strong161 发表于 2017-2-11 13:41
程序就是上面的程序,这只是原来做的东西里面的一小部分,整个程序都我传上来,你看是否用得上 ...

谢谢分享学习一下

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

小黑屋|手机版|Archiver|电子工程世界 ( 京ICP证 060456

GMT+8, 2017-9-21 11:29 , Processed in 0.553559 second(s), 17 queries , Redis On.

快速回复 返回顶部 返回列表