-
2019-11-21 19:18:38
用labview写的串口一直读不到数据,找了很久终于发现原因了。
在写串口之前,先确定串口的配置有没有错。如波特率、校验位、停止位、流控制等。
然后是确定硬件能用。包括USB转串口,单片机。我用的是USB转TTL,最方便的一种验证方法就是,把USB转TTL的RX脚和TX脚短接起来,运行labview写的串口,实现自发自收的功能。验证单片机就用串口调试工具和单片机通信,调试工具发送命令,看单片机能不能返回数据。
labview的串口写法网上有很多,我就不详述了。主要讲一下我遇到的问题。
自己写的串口发下去数据,labview串口接收缓冲区接收不到。已经用上面的方法验证过,可以下发和接收的。后来查看数据类型,发现这个有影响。单片机接收的终止符是\r\n,而我labview发下去的只有\n。这个把发送缓冲区用十六进制显示,就可以看到最后的终止符只有\n,也就是换行符。也可以通过发送的字节数看。\r\n是两个字节,发的数据字节比自己输入的字节数要多两个。我需要的是\r\n,回车CR加换行LF,所以单片机接收不到我发的命令,所以没有返回。换成十六进制输入,增加\r\n,发送,就可以收到自己想要的数据啦。
labview只有一个终止符,也可以自己添加多个终止符,在这里附上NI论坛的链接:http://www.ni.com/tutorial/4256/zhs/
踩过的坑,希望能帮助到大家。
更多相关内容 -
串口收不到数据或者收到错误数据 串口乱码总结
2019-04-28 22:15:031、查看你使用的USB转串口是3.3V的串口还是5V串口,如果发送方使用的是3.3V然后你使用的USB转串口是5V是可以收到数据的但收到的数据都是错误的 2、查看波特率、奇偶校验、停止位等是否设置正确。 3、如果是STM32,...1、查看你使用的USB转串口是3.3V的串口还是5V串口,如果发送方使用的是3.3V然后你使用的USB转串口是5V是可以收到数据的但收到的数据都是错误的
2、查看波特率、奇偶校验、停止位等是否设置正确。
3、如果是STM32,查看寄存器设置是否正确,时钟是否使能
4、查看是否将TX接成RX(很可能两根线接反了),
5、查看线是否是好的,可以换线试试,查看是否存在虚焊现象。特别是TX 、RX 、GND三根线。
6、查看驱动是否已经安装,如果已经安装也能在设备管理器中查看到,特别注意下有感叹号或者其他的其他异常符号,经常以为自己安装完成了,但其实是安装了错误的驱动,即使是驱动精灵安装的驱动也有时候是错误的。
7、查看自己的电脑的串口是否被其他程序占用,有时候因为串口正在使用没有断开串口直接拔掉,这样可能造成USB口无法使用串口,这时候可以考虑更好其他USB口或者重新启动电脑试试。
8、查看是否有干扰信号,特别一些高频信号和电磁信号模拟信等等。
9、可能串口调试助手是无法使用的,可以换其他的串口调试助手软件试试,我就遇到过,以为程序出问题了,查了半天没有解决,换了个串口调试软件就好了。
10、查看对方是hex格式发送还是文本格式发送,或者其他格式发送
11、查看收发是否共GND,如果GND不一样,参考电平不一样那很可能是错误的。
12、查看串口线是否过长,如果不带屏蔽线的话最好在2米以内(具体数字我不是很清楚,但曾经用过差不多5米的网线做的连接线把电脑搞挂了,表现是电脑鼠标自己在动,我还以为中毒呢)
-
Qt串口助手(1)-自动寻找可用串口时读不到串口返回的数据
2022-04-27 09:15:39在使用qt编写串口助手时,想要做一个自动寻找串口的功能,因为项目所使用的开发板会返回从串口写入的数据,所以根据此特性,可以做一个自动寻找可用串口的功能。下面是最初的代码模型。 QList<QString> list...在使用qt编写串口助手时,想要做一个自动寻找串口的功能,因为项目所使用的开发板会返回从串口写入的数据,所以根据此特性,可以做一个自动寻找可用串口的功能。下面是最初的代码模型。
QList<QString> list; //利用QSerialPortInfo类检测串口 foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) { list << info.portName(); //将找到的串口存入list容器 } for(int i = 0;i <list.count();i++) //循环打开每一个串口,向其写入数据 { QByteArray array = "checkdata"; QSerialPort serialport; serialport.setPortName(list.at(i)); if(!serialport_checkport.open(QIODevice::ReadWrite)) { QMessageBox::warning(this,"error",QString("%1 can not open!").arg(serialport_checkport.portName())); return QString(); } serialport.write(array); //写入数据 QByteArray str = serialport.readAll(); //读取数据 qDebug() << serialport.portName() << str; if(str.length()) { qDebug() << "return data"; break; //如果有返回数据则退出循环,该串口就是可用串口 } array.clear(); serialport.clear(); serialport.close(); }
上述代码只是简单实现了写入读取功能,但是运行发现,遍历了所有的串口后没有读取到串口返回的数据。
没有读取到数据的原因有两种,一是没有成功写入,二是写入了但是没有成功读取到数据。仔细检查代码觉得应该是没有读取到返回数据的原因。然后想到有可能是数据读取时间太快的原因,就在写入数据和读取数据中间加上了QTime,让程序暂停一段时间,并使用processEvents()函数继续处理事件。还有一种方法,利用了QTimer定时器和QEventloop类实现。
//方法一 QTime time; time.start(); while (time.elapsed() < 500) //让程序等待一段时间后结束 { QCoreApplication::processEvents(); //进入事件循环 } //方法二 QEventLoop eventloop; QTimer::singleShot(200, &eventloop, SLOT(quit())); //singleShot可以直接使用,不需要创建一个QTimer对象 eventloop.exec(); //QEventLoop类让程序开启循环,使后面的代码等待运行,直到循环结束
在加入了QTime暂停程序后,虽然成功读取到了数据,但是读取的数据格式不对。
由于暂时未解决该乱码问题,通过打印数据长度发现返回的数据长度还是与写入的数据长度一致的,所以可以通过判断数据长度来确定串口。完整代码如下。
QList<QString> list; foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) { list << info.portName(); //将找到的串口存入list容器 } for(int i = 0;i <list.count();i++) //循环打开每一个找到的串口 { QByteArray array = "checkdata"; QSerialPort serialport; serialport.setPortName(list.at(i)); if(!serialport_checkport.open(QIODevice::ReadWrite)) { QMessageBox::warning(this,"error",QString("%1 can not open!").arg(serialport_checkport.portName())); return QString(); } serialport.write(array); //写入数据 //方法一 // QTime time; // time.start(); // while (time.elapsed() < 500) // { // QCoreApplication::processEvents(); //让休眠的程序继续处理事件 // } //方法二 QEventLoop eventloop; QTimer::singleShot(200, &eventloop, SLOT(quit())); eventloop.exec(); QByteArray str = serialport.readAll(); //读取数据 qDebug() << serialport.portName() << str; if(str.length() == array.length()) //比较数据长度 { qDebug() << serialport.portName() << "是可用串口"; array.clear(); serialport.clear(); serialport.close(); return serialport.portName(); } array.clear(); serialport.clear(); serialport.close(); return QString(); }
-
python实现从串口读取数据并绘制动态曲线,同时保存数据,曲线绘制可实现暂停
2019-02-20 15:02:32基于python实现串口通讯,从串口读取数据后进行动态曲线绘制,然后将数据保存到文件中,曲线绘制可实现暂停 -
android 使用服务读取串口数据实例
2017-01-08 13:22:12android 使用服务读取串口数据实例,读取的数据实时写到txt文本。串口读写的库的地址:https://code.google.com/p/android-serialport-api/。我的博客:http://blog.csdn.net/qq_16064871。 -
对python3 Serial 串口助手的接收读取数据方法详解
2020-09-19 07:59:24今天小编就为大家分享一篇对python3 Serial 串口助手的接收读取数据方法详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧 -
linux串口无法接收数据(linunx新手求救)
2021-05-14 01:53:16在linux与windows间进行简单的串行数据的发送接收操作.linux下的程序源码如下,windows用使用串口调试程序收发数据.结果linux发往windows的数据能正常接收,但windows发往linux的数据linux方却无法接收,最奇怪的事是:...在linux与windows间进行简单的串行数据的发送接收操作.linux下的程序源码如下,windows用使用串口调试程序收发数据.结果linux发往windows的数据能正常接收,但windows发往linux的数据linux方却无法接收,最奇怪的事是: windows发送的数据windows自己却收到了(linux没有转发收到的数据,串口线的2,3脚也没有短接;在windows上开两个串口调试程序,在COM1,COM2间发送数据进行试验,一切正常)!!请高人指点迷津.
#include /* Standard input/output definitions */
#include /* String function definitions */
#include /* UNIX standard function definitions */
#include /* File control definitions */
#include /* Error number definitions */
#include /* POSIX terminal control definitions */
#include
#include
#include
#include
int main(void)
{
int recnum,fd;
char buf[1024];
recnum=0;
recnumb=0;
fd=open("/dev/ttyS0",O_RDWR|O_NONBLOCK)
if(fd==-1)
{
perror("failed to open com1:");
return 0;
}
ia=write(fd,"the data come from linux!",25);
if(ia0)
break;
}
printf("%sn",buf);
close(fd);
return 0;
}
|
O_NONBLOCK //它的原因吧,你去掉试一下
-
JAVA netty 获取串口数据并且下发数据
2018-03-19 17:33:38通过Netty4 获取串口数据并且下发数据到串口,是一个封装不错的框架 -
stm32串口接收不到数据的一些问题
2022-01-02 17:54:02菜鸟写的经验,大佬勿喷!...正点原子这个printf函数已经重映射到串口1了,这样的话就相当于在USART2_IRQHandler中断函数里面嵌套了另外一个串口发送中断。问题就是自己定义的usart2中断优先级比print -
Linux串口接收不定长数据和文件
2017-08-22 10:06:37Linux 串口接收不定长数据,网上查找好久都没有找到能用的资源,就自己写了个(ARM能正常使用),最大2K缓冲,接收文件时大于1K写一次缓冲,防止读写次数过多对flash损害。 -
Arduino 串口接收转发十六进制数据,软串口收不到数据
2020-12-23 20:48:05我是Arduino初学者,今日尝试用Arduino nano 收串口发来16进制数据,再由软串口转发给下级设备,下级设备返回16进制数据。首先简单测试代码如下:#include SoftwareSerial mySerial(2,3);void setup(){Serial.begin... -
串口助手接收ModBus协议收上来的数据并进行处理
2020-10-23 09:51:29通过微软的串口调试助手,利用JavaScript脚本编写数据采集程序,程序设计,是通过查阅资料和程序组合进行设计,ModBus RTU协议的使用,以及与设备的连接是通过RS485进行数据连接。 -
C#串口数据读取程序,解决串口数据读取不完整小问题。
2020-01-16 10:02:45在对串口设备进行数据读取的过程中,遇到数据读取不完整的情况,例:完整的数据由506个字节,但每次串口读取的数据数量是随机的,506字节的数据,可能读2次才能全部读取完成整, 第1次100个字节,第2次406个字节;... -
Arduino读取串口接收到的数据并发送数据
2021-04-06 15:05:38Arduino读取串口接收到的数据并发送数据 源程序: void setup() { Serial.begin(115200); } void loop() { String comdata ; while (Serial.available() > 0) { comdata += char(Serial.read()); delay(2); } if... -
Arduino 串口接收数据不正确,数据丢失问题
2020-06-02 21:54:224、一直解释不了,我就把这个接受过数据的数组用led显示出来,我设定接收1显示1,接收0显示0,接收到其他就显示实心方框,led显示如下: ![图片说明]... -
C#串口类SerialPort收不到数据解决办法
2018-08-21 22:29:04最近再做一个项目,串口通信,但是只能受到一次数据后面怎么也收不到,我想了好久?难道微软提供的系统函数有问题?测试好久,发现居然是对方发送数据过快导致收数据回调函数无响应,我推测内存回调时候发生异常或者... -
C#读取串口数据画图
2018-11-12 15:50:43同学在用FPGA做读卡器,上位机准备用labview做,因为不熟悉所以让我用C#做个备份,备不时之需。 菜鸟级别就跑去给人家帮忙,越帮越忙。...1、串口读取数据 2、读取的串口数据存储到txt中 3、在winform中画图 -
Qt串口通信开发之QSerialPort模块Qt串口通信接收数据不完整的解决方法
2021-01-20 01:54:07因为串口数据获取函数readAll()由readyRead()信号触发,但readyRead()信号在串口读到起始标志时立即发送,并不保证一定是当前所发数据的起始部分。 因此串口通信双方在通信前应制定好通信协议,规定好数据的起始和... -
C#读取DataMan100二维码扫描器串口数据的.rar
2019-09-21 15:35:47C#通过对DataMan100二维码扫描器串口数据的读取,并对数据进行有规则的存储及查询,实现一个简单.txt数据库的查询。 -
c#(winform)通过串口读取并解析数据
2020-02-03 09:38:42在开发过程中,有时会遇到通过串口读取地磅等数据,但是在真实的环境测试也不方便,这时使用虚拟串口工具就显得非常方便了,虚拟出两个串口,一个模拟发送数据,一个模拟接收数据。 虚拟串口工具:Configure ... -
linux下串口通信打开正常,发送正常,但是接收不到数据的解决办法
2018-04-27 10:47:02经过查询资料,发现是串口配置一般在正规模式(.c_lflag = ICANON)下,因此数据读取到时一直存放在缓冲区,read()进行读取时只有识别到"回车"或者“换行”符号的时候,才会从缓冲区读取成功。解决办法1:... -
ExMod 串口调试助手 发送Excel等文件中数据、Modbus Rtu Master功能
2020-08-02 18:18:43ExMod串口调试助手主要功能是发送大量串口数据,设计目标是满足上位机串口编程调试之用,是个人把在上位机编程中常用的模拟调试功能汇总到一个调试软件中而成。除普通串口调试助手功能外,还包括发送文件中数据、... -
STM32串口通信串口助手收不到数据
2019-08-01 19:56:44已经确定代码是没有问题的,但是串口调试助手就是收不到消息 解决办法: 别急,我来帮你 右击工程,选择Options for Target ‘test’ 然后。。。。。。 这里打勾, 然后,OK,然后重新编译,打开串口助手,问题解决 ... -
Linux串口接收数据读不完的问题?
2020-12-20 23:55:45用PC的串口调试助手发送数据下来,我发誓11个字节,我一次从串口读取512个字节,但是Linux串口的只接收到8个字节,怎么回事呢?串口一些配置如下:newtio.c_lflag&=~(ICANON);/*Input*/newtio.c_cc[VTIME]=5;//... -
消息队列方式实现串口数据不定长接收 —- RT-thread&STM32
2021-01-20 11:04:45也就是当串口接收数据时,定时器一直处于定时值(比如100ms),接收不断的把数据放入缓冲区(通常可使用数组),当串口空闲时,定时器开始计时,当计时时间到,读取缓冲区的数据即可,这样就实现了数据的不定长接收。... -
串口数据写入到excel
2013-07-17 14:51:58从串口接收2000个数然后传入EXCEL中,进行分析 -
python如何读取串口数据 python读取串口数据代码示例
2020-11-24 03:15:59python如何读取串口数据?本篇文章小编给大家分享一下python读取串口数据代码示例,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看。python3 读取串口数据 ... -
Qt5.2的串口类接收不到串口数据,和事件机制
2014-05-17 21:10:35背景:最近瞎看Qt的东西,然后试了一下Qt自带的串口类。 -
树莓派3b+的烧录系统与串口收发数据(新手小白亲自完成后编写)
2019-03-27 20:47:45刚刚开始玩树莓派,一个新手小白,这是我从烧录ubutu系统到使用树莓派串口收发数据的经验。里面含有我用到的资料,以及我遇到的一些问题及解决方法。 -
使用Python读取串口数据
2020-11-18 16:39:06Python读取串口数据使用Python读取串口数据1.面向百度编程2.应用serial库3.编码设计4.编程实现 使用Python读取串口数据 1.面向百度编程 通过百度,定位到可使用Python的serial库进行读写串口数据。接着,开始用pip...