Qt 串口数据通信

一. 数据接收
1. 大部分教程使用readReady产生信号来触发ReadAll函数读取,但这会造成接收不完整等一些列问题,甚为恶心。一个好的思路是,在点击打开串口后,自己开通一个定时器,设定合适的间隔(就可以发挥主观能动性,根据下位机发送频率来决定间隔)。此时,读取过来就很完美了!
2.如果是整数类型(如编码器数据,会特别大,要用32位来表示),需要移位发送接收,难顶的是Qt直接移位回来并不是原来的数据,比如127之后会变成-128。这是由于计算机补码表示造成的,虽然我也尝试硬上,搞了好久,而未果。
放结论:使用QByteArray toHex().toInt(&ok, 16) 一步搞定。前提是您需要把数据位解析出来单独放在一个新的QbyteArray里面!

二. 数据发送
声明QbyteArray变量

  1. 如果要发送整数:
int Num = 1000;

QbyteArray SendArray;
SendArray[0] = Num << 8;
SendArray[1] = Num;

serial.write(SendArray);  // serial是实例化的一个串口对象
  1. 如果要发送16进制
QbyteArray SendArray;
SendArray[0] = 0x30;
SendArray[1] = 0x31;

serial.write(SendArray);  // serial是实例化的一个串口对象

如果要发送的位数很多,还有更加简洁的,直接发送数组![1]

    uint8_t speed[27] = {0xF7, 0x10, 0x00, 0x50, 0x00, 0x09, 0x12, 0x00, 0x02, 0x00, 0x01, 0xFB, 0xD0, 0xFF, 0xFF, 0x8A, 0xD0, 0x00, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x3D, 0x00};

    serial.write((const char*)speed, sizeof(speed));

Reference
[1] http://www.qtcn.org/bbs/read-htm-tid-56433.html

发布了51 篇原创文章 · 获赞 1 · 访问量 3084

猜你喜欢

转载自blog.csdn.net/m0_38139098/article/details/105029636