极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 11310|回复: 8

求助!关于软串口的编程问题

[复制链接]
发表于 2015-7-9 13:26:35 | 显示全部楼层 |阅读模式
我买了一个攀藤G1的PM2.5传感器,想接在UNO上进行读取串口数据,由于0、1口需要和电脑通讯,我就像用软串口的方式进行传感器和UNO的通讯,并将数据用Serial.print的方式输出在串口调试器上,我学着编写了一串代码,上传到UNO里发现什么显示也没有,不知道该如何解决。小弟刚接触arduino不足10天,需要请教大神们了。
以下是我的代码,请指出错误的地方,谢谢!

  1. #include <SoftwareSerial.h>

  2. SoftwareSerial pt(10,11);  \\定义10和11脚为软串口,软串口名称为pt
  3. int pm;  \\定义传感器的变量名称为pm,实际传感器输出的是16进制的数据,不知道该如何定义
  4. void setup(){
  5.   Serial.begin(9600);
  6.   pt.begin(9600); \\软串口初始化
  7.   pt.listen(); \\监听软串口
  8.    
  9. }

  10. void loop(){
  11.   if(Serial.available()>0)
  12.     pt.read();  \\读取软串口数据
  13.   pt.println(pm);  \\打印软串口数据
  14.   delay(1000)   ;
  15. }
复制代码
回复

使用道具 举报

发表于 2015-7-9 13:50:54 | 显示全部楼层
参考之前我做的  http://www.lab-z.com/g1pm25/
回复 支持 反对

使用道具 举报

发表于 2015-7-9 13:52:16 | 显示全部楼层
输出的串口不对,程序里使用的是虚拟串口,改为硬串口就好了
回复 支持 反对

使用道具 举报

发表于 2015-7-9 21:32:41 | 显示全部楼层
本帖最后由 mc.six 于 2015-7-9 21:34 编辑

  if(Serial.available()>0)
    pt.read();  \\读取软串口数据
  pt.println(pm);  \\打印软串口数据

写反了,应该是:
  if(pt.available()>0)
    pt.read();  \\读取软串口数据
  Serial.println(pm);  \\打印软串口数据

另外pm没赋值,pt.read()也只读出来了一个字节,怎么可能对呢。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-7-9 21:33:14 | 显示全部楼层
zoologist 发表于 2015-7-9 13:50
参考之前我做的  http://www.lab-z.com/g1pm25/

您好,我看了您的帖子,后来直接用串口板接G1,并用您的软件测试了。同时,我也读取了串口的数据,根据攀藤的datasheet计算的话,好像和您的数据相差很大。不知是什么问题。
以下是我根据网上的资料重新整理的arduino的程序,您可以和您的程序对比一下,看看有什么差异,因为我也不是很懂。

  1. static unsigned char ucRxBuffer[250];
  2. static unsigned char ucRxCnt = 0;

  3. long  pmat10=0;
  4. long  pmat25=0;
  5. long  pmat100=0;

  6. void setup()
  7. {
  8.   Serial.begin(9600);
  9.   // Serial2.begin(9600);
  10. }

  11. void loop()
  12. {
  13.   
  14. delay(5000);
  15.   while (Serial.available())
  16.   {
  17.     CopeSerialData(Serial.read());
  18.   }


  19. }

  20. char CopeSerialData(unsigned char ucData)
  21. {
  22.   ucRxBuffer[ucRxCnt++]=ucData;

  23.   if (ucRxBuffer[0]!=0x42&&ucRxBuffer[1]!=0x4D)
  24.   {
  25.     ucRxCnt=0;
  26.     return ucRxCnt;
  27.   }
  28.   if (ucRxCnt<32) {
  29.     return ucRxCnt;
  30.   }
  31.   else
  32.   {
  33.     pmat10=(float)ucRxBuffer[10]*256+(float)ucRxBuffer[11];  
  34.     Serial.print("PM1.0:");
  35.     Serial.print(pmat10);
  36.     Serial.println("ug/m3");
  37.     pmat25=(float)ucRxBuffer[12]*256+(float)ucRxBuffer[13];  
  38.     Serial.print("PM2.5:");
  39.     Serial.print(pmat25);
  40.     Serial.println("ug/m3");
  41.     pmat100=(float)ucRxBuffer[14]*256+(float)ucRxBuffer[15];  
  42.     Serial.print("PM10:");
  43.     Serial.print(pmat100);
  44.     Serial.println("ug/m3");
  45.     Serial.println("----------------------------");
  46.     ucRxCnt=0;
  47.     return ucRxCnt;
  48.    
  49.   }
  50. }
复制代码
回复 支持 反对

使用道具 举报

发表于 2015-7-9 21:42:31 | 显示全部楼层
http://www.geek-workshop.com/thread-14547-1-1.html看这个试试,自己慢慢研究,我也是慢慢试出来的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-7-9 22:27:13 | 显示全部楼层
mc.six 发表于 2015-7-9 21:42
http://www.geek-workshop.com/thread-14547-1-1.html看这个试试,自己慢慢研究,我也是慢慢试出来的。

我就是参考的您的帖子修改的程序,把多余的部分都删除了,用的是那个没有库的文件修改的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-7-9 22:41:29 | 显示全部楼层
这是我用串口读取的原始数据,根据攀藤的datasheet转换成10进制,再相加得出的PM值的数据,不知道对不对。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2015-7-10 12:53:06 | 显示全部楼层
活得精彩 发表于 2015-7-9 22:41
这是我用串口读取的原始数据,根据攀藤的datasheet转换成10进制,再相加得出的PM值的数据,不知道对不对。

看着挺对,应该没问题
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-3-29 00:46 , Processed in 0.042266 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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