在Qt5之前,串口通信基本依赖于第三方库,下面是我曾接触过的串口通信类库:
以上串口通信类库通信过程基本是一下步骤,即:打开串口 > 配置串口参数 > 收发数据。
注意,串口参数(波特率、数据位、停止位、奇偶校验、流控等)必须在串口打开之后进行配置才有效。
在使用串口接收数据时,会出现数据接收不完整的情况,这种情况很常见,尤其是在 QextSerialPort 和 QSerialPort 中,有一段时间我不得不怀疑是不是参数或者是硬件问题。后来发现这并不是异常,在通信中我依赖 readAll() 函数获取串口数据,但 readAll() 由 readyRead()信号触发,readyRead在串口读到起始标志时立即发送,并不一保证一定是当前所发数据的起始部分。因此串口通信双方通信前应制定好通信协议,规定好数据的起始于结尾标志,串口当读到完整的起始于结束标志之后,才认定读完一条完整的数据。
下面分别就这三种串口通信类库进行实例代码的编写。
QextSerialPort使用小例
QextSerialPort在Window平台下可用Win_QextSerialPort进行串口通信,下面对Win_QextSerialPort再一次封装的串口通信类SerialPort:
头文件:serialport.h
1 #ifndef SERIALPORT_H2 #define SERIALPORT_H
3
4 #include
5
6
7
8 /**9 * @brief 串口参数10 */
11 structSerialConfig{12 int baudRate; //波特率
13 int characterSize; //传输位
14 int stopBits; //停止位
15 int parity; //校验位 0无校验 1奇校验 2偶校验16 //char*serialPort[20];//设备文件名
17 int flowControl; //流控
18 long timeOut; //超时时间
19 };20
21 classWin_QextSerialPort;22
23 /**24 * @brief 串口通信类25 */
26 class SerialPort : publicQObject27 {28 Q_OBJECT29 public:30
31 explicit SerialPort(QString portName, QObject *parent = 0);32 //~SerialPort();
33
34 /**35 * @brief 串口数据大发送格式36 */
37 enumSerialDataType{38 ASCLL=0, //ascll方式
39 HEX //二进制方式
40 };41 /**42 * @brief 配置串口参数43 * @param config44 */
45 void setSerila(SerialConfig *config);46
47 /**48 * @brief 获取串口开启状态49 * @return50 */
51 boolisOpend();52
53 /**54 * @brief 设置数据发送方式55 * @param type56 */
57 voidsetSerialDataType(SerialDataType type);58 signals:59 /**60 * @brief 串口获取到数据61 */
62 voidstrSerial(QString);63 publicslots:64
65
66 /**67 * @brief 开启串口68 * @param 串口参数69 * @return 是否成功打开串口70 */
71 bool op