QT与python的串口通信

[复制链接]
1464|4
 楼主| gaoyang9992006 发表于 2019-6-17 15:37 | 显示全部楼层 |阅读模式
Python接口

     在python中需要使用pyserial接口

  1. from __future__ import division  
  2. import serial
  3. import time
  4. import serial.tools.list_ports  
  5. import os
  6. port_list = list(serial.tools.list_ports.comports())  
  7. if len(port_list) <= 0:  
  8.     os.system('echo %s' %("The Serial port can't find!"))
  9. else:
  10.     for i,port in enumerate(port_list):
  11.         os.system('echo %s' %port[0])
  12. class Serial_prot():
  13.     def __init__(self):
  14.         try:
  15.             self.ser = serial.Serial('COM5',9600,timeout=0.1)#串口初始化
  16.         except serial.SerialException:
  17.             os.system('echo Can not open the serial %s' %('com5'))
  18.     def hexShow(self,argv):  
  19.         result = ''  
  20.         hLen = len(argv)  
  21.         for i in xrange(hLen):  
  22.             hvol = ord(argv[i])  
  23.             hhex = '%02x'%hvol  
  24.             result += hhex
  25.         os.system('echo %s' %str(int(result[6:14],16)/1000))
  26.     def set_zero(self):
  27.         #reset zero
  28.         self.ser.write('\x01\x10\x00\x00\x00\x02\x04\x00\x00\x00\x00\xF3\xAF')#串口写数据
  29.         time.sleep(1)
  30.     def run(self):
  31.         while True:
  32.             self.ser.write('\x01\x03\x00\x00\x00\x02\xC4\x0B')
  33.             time.sleep(0.3)
  34.             self.hexShow(self.ser.readline())
  35.     def close(self):
  36.         self.ser.close()
  37. #flag=sys.argv[1]
  38. def main():
  39.     sers=Serial_prot()
  40.     sers.run()

  41. if __name__ == '__main__':
  42.     main()

上述的代码中,使用os.system进行输出信息,而不用print输出,因为print输出的信息,在Qt的Qprocess::readAllStandardOutput()无法捕捉的信息。


 楼主| gaoyang9992006 发表于 2019-6-17 15:39 | 显示全部楼层
Qt接口  1、需要在".pro"文件中加入“QT += serialport“,否则会报错。
     2、头文件是必不可少的。
  1. #include <QtSerialPort/QSerialPort>
3、串口初试化。

  1. QSerialPort serial;
  1. serial.setPortName("COM5");        //设置COM口
  2. serial.setBaudRate(QSerialPort::Baud9600,QSerialPort::AllDirections);//设置波特率和读写方向
  3. serial.setDataBits(QSerialPort::Data8);                //数据位为8位
  4. serial.setFlowControl(QSerialPort::NoFlowControl);//无流控制
  5. serial.setParity(QSerialPort::NoParity);        //无校验位
  6. serial.setStopBits(QSerialPort::OneStop);        //一位停止位
  7. serial.close();                                        //先关串口,再打开,可以保证串口不被其它函数占用。


4、需要定时读取或写入程序,初始化一个定时器,并定义信号与槽。
  1. QTimer *timer_serial;
  2. timer_serial =new QTimer();
  3. connect (timer_serial,SIGNAL(timeout()),this,SLOT(process_read_weight_fun()));
5、启动定时器打开串口。
  1.     if(timer_serial->isActive ()==false){
  2.         serial.open(QIODevice::ReadWrite);
  3.         timer_serial->start (30);
  4.     }


 楼主| gaoyang9992006 发表于 2019-6-17 15:41 | 显示全部楼层
  6、读写串口
  1. //读取传感器中的数据
  2. void MainWindow::process_read_weight_fun()
  3. {
  4.     bool ok;
  5.     const unsigned char s[8]={0x01,0x03,0x00,0x00,0x00,0x02,0xC4,0x0B};
  6.     serial.write ((char*)s,8);//以ASCII码的形式通过串口发送出去。
  7.     serial.waitForBytesWritten (300);
  8.     QByteArray temp=serial.read(10);//在缓冲区中读一个byte
  9.     serial.waitForReadyRead (100);
  10.     float weight=temp.toHex ().left (14).right (8).toInt (&ok,16)/1000.;
  11.     para_weight_show->setText (QString::number(weight, 'f',2)+" Kg");
  12. }
 楼主| gaoyang9992006 发表于 2019-6-17 15:41 | 显示全部楼层
至此,python和Qt接口的串口操作完毕,大家如有不懂,应该多参考Qt或python关于串口的API,里面介绍还是比较详细的
飞翔的鱼2019 发表于 2019-7-2 17:13 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:如果你觉得我的分享或者答复还可以,请给我点赞,谢谢。

2052

主题

16405

帖子

222

粉丝
快速回复 在线客服 返回列表 返回顶部