# 任务5_Serial **Repository Path**: MrDreamQ/task-5--serial ## Basic Information - **Project Name**: 任务5_Serial - **Description**: 任务5_Serial——串口通信 - **Primary Language**: C++ - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2021-10-06 - **Last Updated**: 2023-07-17 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 任务5_Serial(请查看使用说明,因一些原因直接使用了g++编译而未用`cmake`) 学习与参考的[博客](https://blog.csdn.net/yaowangII/article/details/79806377#commentBox) ## 项目介绍——串口通信 ### 虚拟串口生成 本人采用虚拟串口进行本机的通信。 文件中的virtualPort.py可以建立两个虚拟串口,键入命令: ```bash python3 virtualPort.py ``` 即可建立两个虚拟串口,如图: ![虚拟串口生成](https://s3.bmp.ovh/imgs/2021/10/e655d38fd8718fd8.png) ### 串口通信相关代码 > + SerialPort.h > + SerialPort.cpp > + main.cpp 以上代码是创建和调用串口通信线程的代码。 生成串口通信的程序: ```bash g++ main.cpp SerialPort.cpp -o Read -lpthread -D READ // 编译读写串口数据的程序 g++ main.cpp SerialPort.cpp -o Write -lpthread -D WRITE // 编译往串口写入数据的程序 ``` 即会生成读写串口数据的程序Read和往串口写入数据的程序Write。 串口写入数据的线程体如下: ```c++ // 线程体,不断地写入数据 void *WriteFunction(void *arg) { SerialPort *serialPort = (SerialPort *)arg; char buffer[50]; while(1) { std::cin >> buffer; if(!serialPort->Write(buffer,strlen(buffer))) { printf("write failed\n"); } printf("write: %s\n",buffer); sleep(1); } } ``` 串口读取数据的线程体如下: ```c++ void *ReadFunction(void *arg) { SerialPort *serialPort = (SerialPort *)arg; char buffer[100]; static int readSize = 99; while(1) { int len = serialPort->Read(buffer,99); if(len > 0) { buffer[len] = '\0'; printf("receive data:%s, len = %d\n",buffer,len); } else { printf("cannot receive data\n"); } sleep(1); } } ``` ## 使用说明 先键入命令生成虚拟串口: ```bash python3 virtualPort.py ``` 生成了虚拟串口后(如效果图中打开了9和10,但可能每次打开都不一样),在另两个终端分别调用Read和Write程序: ```bash ./Read <串口名,如图中的/dev/pts/9> ``` ```bash ./Write <串口名,如图中的/dev/pts/9> ``` 即可查看到虚拟串口通信的效果,如图: ![](https://s3.bmp.ovh/imgs/2021/10/b381965208afa56f.png) **硬件的串口通信同理,程序名后带上启用的硬件串口名即可。** ## 额外记录(CMakeLists中链接线程创建与读取库pthread) ```cmake set_target_properties(task5 PROPERTIES COMPILE_FLAGS "-pthread" LINK_FLAGS "-pthread") ``` ## 硬件的串口通信 ### cutecom下模拟数据收发 ![](https://s3.bmp.ovh/imgs/2021/10/a333d4a396146dcc.png) ### 使用说明——串口通信程序编译 接入USB-ttl接口 项目文件夹下生成串口通信的程序: ```bash g++ main.cpp SerialPort.cpp -o Read -lpthread -D READ // 编译读写串口数据的程序 g++ main.cpp SerialPort.cpp -o Write -lpthread -D WRITE // 编译往串口写入数据的程序 ``` 即会生成读写串口数据的程序`Read`和往串口写入数据的程序`Write`。 在另两个终端分别调用Read和Write程序: ```bash ./Read /dev/ttyUSB0 ``` ```bash ./Write /dev/ttyUSB0 ``` 本人将USB-ttl的信息发送端tx与接收端rx短接,在本机进行串口通信的调试,效果如下 ![](https://s3.bmp.ovh/imgs/2021/10/217d8bc113f4e43f.png)