最近一直在弄qt的一个项目,遇到一个需求,就是需要实现发送一个串口实现控制灯光开关的需求,硬件方面搞好了,接收到字符串"a"表示关灯,接收到字符串"b"表示开灯,话不多说,直接用qt代码实现,代码如下所示
void MainWindow::send(QByteArray data)
{
// 端口号,根据自己实际情况输入,可以在设备管理器查看
QSerialPort serial;
QString serialPortName = "COM2";
qint32 baudRate = 115200;
serial.setPortName(serialPortName);
serial.setBaudRate(baudRate);
serial.setDataBits(QSerialPort::Data8);
serial.setParity(QSerialPort::NoParity);
serial.setStopBits(QSerialPort::OneStop);
serial.setFlowControl(QSerialPort::NoFlowControl);
if (serial.open(QIODevice::ReadWrite))
{
qDebug() << "Serial port opened successfully.";
}
else
{
qDebug() << "Failed to open serial port!";
}
qint64 bytesWritten = serial.write(data);
qDebug() << "Bytes written:" << bytesWritten;
serial.close();
}
这里我封装好了send方法,为了方便测试,我们用VSPD软件来创建2个虚拟串口,看看能不能实现收发数据,如图所示
我们创建了2个虚拟串口COM1和COM2,我们可以到设备管理器中查看是否存在这2个串口,如图所示
可以看到我们用软件创建出来的串口,接下来我们来进行收发数据测试,这里为了方便我下载了一个XCOM串口通信调试助手软件来辅助,如图所示
这个软件主要来测试我们代码发送给他的数据,实质就是接收作用,或不多说,我们执行上面代码来验证,我们调用send方法,如下所示
然后运行代码,结果如下所示
发送成功,我们来看调试助手有没有接收到,如图所示
为什么会这样呢,同样的代码我们转成python代码再来测试下,代码如下所示
import serial #导入模块
def send(value):
# 端口号,根据自己实际情况输入,可以在设备管理器查看
port = "COM2"
# 串口波特率,根据自己实际情况输入
bps = 115200
# 打开串口,并返回串口对象
uart = serial.Serial(port, bps)
# 串口发送一个字符串
len = uart.write(f"{value}".encode('utf-8'))
# 关闭串口
uart.close()
send('b')
执行代码如图所示
显示接收成功了,为啥qt就不行呢,开始我纠结是版本的原因,我的版本是qt5.7,后面我又下载了5.14的结果还是一样,后面大佬的提醒发现发送数据后再加个代码
serial.flush();
或者
serial.waitForBytesWritten(100);
上面代码是强制要求发送完数据再关闭串口,就是用于等待所有输出数据完成发送。哈哈,这是一个坑哈,花了我好久时间。
如果上述代码帮助您很多,可以打赏下以减少服务器的开支吗,万分感谢!


点击此处登录后即可评论