参考:
- https://blog.csdn.net/haifengid/article/details/51996613
- https://blog.csdn.net/u010925447/article/details/76586055?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522161614372216780357289386%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=161614372216780357289386&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~baidu_landing_v2~default-1-76586055.first_rank_v2_pc_rank_v29&utm_term=linux%E4%B8%B2%E5%8F%A3%E5%A4%9A%E7%BA%BF%E7%A8%8B%E6%8E%A5%E6%94%B6
项目场景:
运行环境:Ubuntu18.04,linux系统,gcc编译器
实现描述:
- 需求:由于目前需要实现对于多个串口数据的收发,同时,或许可以利用多线程实现异步收发等;
- 问题:但是通过Windows平台的虚拟串口在一个Windows笔记本上没有实现和linux的通信;而且硬件设备来实现串口数据输入的话会存在接触不良而数据没有接受到等问题;
- 解决思路:所以对于linux下的虚拟串口进行了搜索实现。
实现过程:
一、首先在Windows环境下进行了虚拟串口VSPD的安装和使用。
参考:https://blog.csdn.net/u011854789/article/details/51896534
1、安装好VSPD后,首先选择你要虚拟的端口号,点击“添加端口”。一般现在的笔记本电脑都没有串口,所以可以选COM1和COM2。
2、虚拟好端口后,左侧能看到新虚拟出的COM1和COM2,此时两个端口应该都没有被占用,处于停用状态。
3、打开串口调试助手,设置COM1的波特率、奇偶校验位、数据位、停止位等参数,同时确保COM2是未占用状态。我们这样设置,是为了让COM1负责发送数据,COM2负责接收数据。如果COM2也被占用,那么你的程序就无法使用这个端口了。
4、在图中方框位置填入你要模拟的数据,然后点击“自动发送”,这时你应该看到进度条不断前进,而VSPD的COM1的Sent数据不断增长,说明串口调试助手正不断通过COM1发送数据。
5、打开你要调试的程序,在你的程序中设置好波特率等各种参数,即可看到模拟结果了。此时可以观察到VSPD中的COM2被Java占用了,而且Received数据不断增长。
【为何不能插入文件呀,想要把安装包放这里】
6、但是没有成功,结果如下图:
注意:相应的程序中,缩写的设备为ttyS2
7、后来停用掉Windows环境下的串口和虚拟串口,直接运行linux中的程序,发现并没有什么影响。
好吧,验证下来,这个虚拟串口在两个平台之间不可以成功。
二、接着进行linux环境下Python语言的虚拟串口程序运行;
进行linux环境下串口收发,成功实现。
参考:https://blog.csdn.net/haifengid/article/details/51996613
1、创建mkptych.py、receive1.c、send1.c三个文件,并放置于linux的同一个工程文件中。
mkptych.py
注意:在终端里运行“python mkptych.py&”,这样就可以生成一个基于pty(伪终端)的虚拟端口对,两个设备名会显示在终端里。然后就可以利用这两个设备名在本机上进行虚拟串口之类的调试, 使用完后用ps查看这个python进程的pid号,然后kill掉即可。
#! /usr/bin/env python
#coding=utf-8
import pty
import os
import select
def mkpty():
#打开伪终端
master1, slave = pty.openpty()
slaveName1 = os.ttyname(slave)
master2, slave = pty.openpty()
slaveName2 = os.ttyname(slave)
print '\nslavedevice names: ', slaveName1, slaveName2
return master1, master2
if __name__ == "__main__":
master1, master2 = mkpty()
while True:
rl, wl, el = select.select([master1,master2], [], [], 1)
for master in rl:
data = os.read(master, 128)
print "read %d data." % len(data)
if master==master1:
os.write(master2, data)
else:
os.write(master1, data)
send1.c
//send.c
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<termios.h>
#define MAX_BUFFER_SIZE 512
int fd,flag_close;
int open_serial()
{
//这里的/dev/pts/1是使用mkptych.py虚拟的两个串口名字之一
fd = open("/dev/pts/5",O_RDWR | O_NOCTTY | O_NONBLOCK);
if(fd == -1)
{
perror("open serial porterror!\n");
return -1;
}
printf("Open serial portsuccess!");
return 0;
}
int main(int argc, char*argv[])
{
char sbuf[] = {"Hello, thisis a serial port test!\n"};
int retv;
struct termios option;
retv =open_serial();
if(retv <0)
{
perror("open serial porterror!\n");
return -1;
}
printf("Ready for sendingdata...\n");
tcgetattr(fd,&option);
cfmakeraw(&option);
cfsetispeed(&option,B9600);
cfsetospeed(&option,B9600);
tcsetattr(fd, TCSANOW,&option);
int length =sizeof(sbuf);
retv = write(fd, sbuf,length);
if(retv == -1)
{
perror("Write dataerror!\n");
return -1;
}
printf("The number of charsent is %d\n", retv);
return 0;
}
receive1.c
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<termios.h>
#include<math.h>
#define MAX_BUFFER_SIZE 512
int fd,s;
int open_serial()
{
//这里的 /dev/pts/2是使用 mkptych.py虚拟的两个串口名字之一
fd = open("/dev/pts/4",O_RDWR|O_NOCTTY|O_NDELAY);
if(fd == -1)
{
perror("open serial porterror!\n");
return -1;
}
printf("open/dev/ttyS0.\n");
return 0;
}
int main()
{
char hd[MAX_BUFFER_SIZE],*rbuf;
int flag_close,retv;
struct termios opt;
retv =open_serial();
if(retv <0)
{
printf("Open serrial porterror!\n");
return -1;
}
tcgetattr(fd,&opt);
cfmakeraw(&opt);
cfsetispeed(&opt,B9600);
cfsetospeed(&opt,B9600);
tcsetattr(fd, TCSANOW,&opt);
rbuf = hd;
printf("Ready for receivingdata...\n");
while(1)
{
while((retv = read(fd,rbuf, 1)) > 0)
printf( "%c ",*rbuf);
}
printf("\n");
flag_close =close(fd);
if(flag_close ==-1)
printf("Close the devicefailure!\n");
return 0;
}
- 自己写的多线程串口收发程序:
要注意设备的宏定义,写正确,否则两个串口对不上,则收不到数据。
1 启动线程1读串口
2 等待3秒后
3 启动线程2写串口,发送字符串后关闭
4 等待10秒
5 关闭两个线程
#include<pthread.h>
#include<stdio.h>
#include<sys/time.h>
#include<string.h>
#include<termios.h>
#include<sys/stat.h>
#include<fcntl.h>
#define BAUDRATE B115200
#define MODEMDEVICE "/dev/pts/4"
#define R_BUF_LEN (256)
void printtid(void);
void* com_read(void* pstatu)
{
printtid();
int i=0;
int fd,c=0,num;
struct termios oldtio,newtio;
char buf[R_BUF_LEN];
printf("start...\n");
/*打开PC机的COM1通信端口*/
fd=open(MODEMDEVICE,O_RDWR | O_NOCTTY | O_NONBLOCK/*| O_NDELAY*/);
if(fd<0)
{
perror(MODEMDEVICE);
exit(1);
}
printf("open ...\n");
/*将目前终端机的结构保存至oldtio结构*/
tcgetattr(fd,&oldtio);
/*清除newtio结构,重新设置通信协议*/
bzero(&newtio,sizeof(newtio));
/*通信协议设为8N1,8位数据位,N没有效验,1位结束位*/
newtio.c_cflag = BAUDRATE |CS8|CLOCAL|CREAD;
newtio.c_iflag = IGNPAR;
newtio.c_oflag = 0;
/*设置为正规模式*/
newtio.c_lflag=ICANON;
/*清除所有队列在串口的输入*/
tcflush(fd,TCIFLUSH); /*新的termios的结构作为通信端口的参数*/
tcsetattr(fd,TCSANOW,&newtio);
printf("reading...\n");
while(*(int*)pstatu)
{
num = read(fd,buf, R_BUF_LEN);
buf[R_BUF_LEN-1] = 0;
if(num > 0 && num <= R_BUF_LEN)
{
buf[num]=0;
printf("%s", buf);
fflush(stdout);
}
}
printf("close...\n");
close(fd);
/*恢复旧的通信端口参数*/
tcsetattr(fd,TCSANOW,&oldtio);
}
void* com_send(void* p)
{
printtid();
int fd,c=0;
struct termios oldtio,newtio;
char ch;
static char s1[20];
printf("Start...\n");
/*打开arm平台的COM1通信端口*/
fd=open(MODEMDEVICE,O_RDWR | O_NOCTTY);
if(fd<0)
{
perror(MODEMDEVICE);
exit(1);
}
printf(" Open...\n");
/*将目前终端机的结构保存至oldtio结构*/
tcgetattr(fd,&oldtio);
/*清除newtio结构,重新设置通信协议*/
bzero(&newtio,sizeof(newtio));
/*通信协议设为8N1*/
newtio.c_cflag =BAUDRATE |CS8|CLOCAL|CREAD; //波特率 8个数据位 本地连接 接受使能
newtio.c_iflag=IGNPAR; //忽略奇偶校验错误
newtio.c_oflag=0;
/*设置为正规模式*/
newtio.c_lflag=ICANON; //规范输入
/*清除所有队列在串口的输出*/
tcflush(fd,TCOFLUSH);
/*新的termios的结构作为通信端口的参数*/
tcsetattr(fd,TCSANOW,&newtio);
printf("Writing...\n");
while(*(char*)p != 0)
{
int res = 0;
res = write(fd,(char*)p, 1);
if(res != 1) printf("send %c error\n", *(char*)p);
else printf("send %c ok\n", *(char*)p);
++p;
}
printf("Close...\n");
close(fd);
/*还原旧的通信端口参数*/
tcsetattr(fd,TCSANOW,&oldtio);
printf("leave send thread\n");
}
/*
开始线程
thread_fun 线程函数
pthread 线程函数所在pthread变量
par 线程函数参数
COM_STATU 线程函数状态控制变量 1:运行 0:退出
*/
int start_thread_func(void*(*func)(void*), pthread_t* pthread, void* par, int* COM_STATU)
{
*COM_STATU = 1;
memset(pthread, 0, sizeof(pthread_t));
int temp;
/*创建线程*/
if((temp = pthread_create(pthread, NULL, func, par)) != 0)
printf("线程创建失败!\n");
else{
int id = pthread_self();
printf("线程%u被创建\n", *pthread);
}
return temp;
}
/*
结束线程
pthread 线程函数所在pthread变量
COM_STATU 线程函数状态控制变量 1:运行 0:退出
*/
int stop_thread_func(pthread_t* pthread, int* COM_STATU)
{
printf("prepare stop thread %u\n", *pthread);
*COM_STATU = 0;
if(*pthread !=0)
{
pthread_join(*pthread, NULL);
}
printf("线程%d退出!\n", *COM_STATU);
}
void printtid(void)
{
int id = pthread_self();
printf("in thread %u\n", id);
}
int main()
{
printf("读取设备为:%d\n",MODEMDEVICE);
pthread_t thread[2];
printtid();
const int READ_THREAD_ID = 0;
const int SEND_THREAD_ID = 1;
int COM_READ_STATU = 0;
int COM_SEND_STATU = 0;
if(start_thread_func(com_read, &thread[READ_THREAD_ID], &COM_READ_STATU, &COM_READ_STATU) != 0)
{
printf("error to leave\n");
return -1;
}
printf("wait 3 sec\n");
sleep(3);
printf("wake after 3 sec\n");
if(start_thread_func(com_send, &thread[SEND_THREAD_ID],"ABCDEFGHIJKLMNOPQRST", &COM_SEND_STATU) != 0)
{
printf("error to leave\n");
return -1;
}
printtid();
printf("wait 10 sec\n");
sleep(10);
printf("wake after 10 sec\n");
stop_thread_func(&thread[READ_THREAD_ID], &COM_READ_STATU);
stop_thread_func(&thread[SEND_THREAD_ID], &COM_SEND_STATU);
return 0;
}
2、在linux中运行:
sudo ./send1
sudo ./Serial_Test1
————————————————————————————————————————————————————————————————————————————————————————
2021.3.25
更新两个串口的收发
直接使用上面原来的程序,存在一些错误,经过简单修改,用了4个变量来实现两个串口的收发。
#include<pthread.h>
#include<stdio.h>
#include<sys/time.h>
#include<string.h>
#include<termios.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<stdlib.h>
#define BAUDRATE B115200
#define MODEMDEVICE "/dev/pts/4"
#define R_BUF_LEN (256)
void printtid(void);
void* com_read(void* pstatu)
{
printtid();
int i=0;
int fd,c=0,num;
struct termios oldtio,newtio;
char buf[R_BUF_LEN];
printf("start...\n");
/*打开PC机的COM1通信端口*/
fd=open(MODEMDEVICE,O_RDWR | O_NOCTTY | O_NONBLOCK/*| O_NDELAY*/);
if(fd<0)
{
perror(MODEMDEVICE);
exit(1);
}
printf("open ...\n");
/*将目前终端机的结构保存至oldtio结构*/
tcgetattr(fd,&oldtio);
/*清除newtio结构,重新设置通信协议*/
bzero(&newtio,sizeof(newtio));
/*通信协议设为8N1,8位数据位,N没有效验,1位结束位*/
newtio.c_cflag = BAUDRATE |CS8|CLOCAL|CREAD;
newtio.c_iflag = IGNPAR;
newtio.c_oflag = 0;
/*设置为正规模式*/
newtio.c_lflag=ICANON;
/*清除所有队列在串口的输入*/
tcflush(fd,TCIFLUSH); /*新的termios的结构作为通信端口的参数*/
tcsetattr(fd,TCSANOW,&newtio);
printf("reading...\n");
while(*(int*)pstatu)
{
num = read(fd,buf, R_BUF_LEN);
buf[R_BUF_LEN-1] = 0;
if(num > 0 && num <= R_BUF_LEN)
{
buf[num]=0;
printf("%s", buf);
fflush(stdout);
}
}
printf("close...\n");
close(fd);
/*恢复旧的通信端口参数*/
tcsetattr(fd,TCSANOW,&oldtio);
}
void* com_send(void* p)
{
printtid();
int fd,c=0;
struct termios oldtio,newtio;
char ch;
static char s1[20];
printf("Start...\n");
/*打开arm平台的COM1通信端口*/
fd=open(MODEMDEVICE,O_RDWR | O_NOCTTY);
if(fd<0)
{
perror(MODEMDEVICE);
exit(1);
}
printf(" Open...\n");
/*将目前终端机的结构保存至oldtio结构*/
tcgetattr(fd,&oldtio);
/*清除newtio结构,重新设置通信协议*/
bzero(&newtio,sizeof(newtio));
/*通信协议设为8N1*/
newtio.c_cflag =BAUDRATE |CS8|CLOCAL|CREAD; //波特率 8个数据位 本地连接 接受使能
newtio.c_iflag=IGNPAR; //忽略奇偶校验错误
newtio.c_oflag=0;
/*设置为正规模式*/
newtio.c_lflag=ICANON; //规范输入
/*清除所有队列在串口的输出*/
tcflush(fd,TCOFLUSH);
/*新的termios的结构作为通信端口的参数*/
tcsetattr(fd,TCSANOW,&newtio);
printf("Writing...\n");
while(*(char*)p != 0)
{
int res = 0;
res = write(fd,(char*)p, 1);
if(res != 1) printf("send %c error\n", *(char*)p);
else printf("send %c ok\n", *(char*)p);
++p;
}
printf("Close...\n");
close(fd);
/*还原旧的通信端口参数*/
tcsetattr(fd,TCSANOW,&oldtio);
printf("leave send thread\n");
}
/*
开始线程
thread_fun 线程函数
pthread 线程函数所在pthread变量
par 线程函数参数
COM_STATU 线程函数状态控制变量 1:运行 0:退出
*/
int start_thread_func(void*(*func)(void*), pthread_t* pthread, void* par, int* COM_STATU)
{
*COM_STATU = 1;
memset(pthread, 0, sizeof(pthread_t));
int temp;
/*创建线程*/
if((temp = pthread_create(pthread, NULL, func, par)) != 0)
printf("线程创建失败!\n");
else{
int id = pthread_self();
printf("线程%lu被创建\n", *pthread);
}
return temp;
}
/*
结束线程
pthread 线程函数所在pthread变量
COM_STATU 线程函数状态控制变量 1:运行 0:退出
*/
int stop_thread_func(pthread_t* pthread, int* COM_STATU)
{
printf("prepare stop thread %lu\n", *pthread);
*COM_STATU = 0;
if(*pthread !=0)
{
pthread_join(*pthread, NULL);
}
printf("线程%d退出!\n", *COM_STATU);
}
void printtid(void)
{
int id = pthread_self();
printf("in thread %u\n", id);
}
int main()
{
printf("读取设备为:%s\n",MODEMDEVICE);
pthread_t thread[4];
printtid();
const int READ_THREAD_ID_1 = 0;
const int SEND_THREAD_ID_1 = 1;
const int READ_THREAD_ID_2 = 2;
const int SEND_THREAD_ID_2 =3;
//2
int COM_READ_STATU_1 = 0;
int COM_SEND_STATU_1 = 0;
if(start_thread_func(com_read, &thread[READ_THREAD_ID_1], &COM_READ_STATU_1, &COM_READ_STATU_1) != 0)
{
printf("error to leave\n");
return -1;
}
printf("wait 3 sec\n");
sleep(3);
printf("wake after 3 sec\n");
if(start_thread_func(com_send, &thread[SEND_THREAD_ID_1],"FF 03 A7 A0", &COM_SEND_STATU_1) != 0)
{
printf("error to leave\n");
return -1;
}
printtid();
printf("wait 10 sec\n");
sleep(10);
printf("wake after 10 sec\n");
//2
int COM_READ_STATU_2 = 0;
int COM_SEND_STATU_2 = 0;
if(start_thread_func(com_read, &thread[READ_THREAD_ID_2], &COM_READ_STATU_2, &COM_READ_STATU_2) != 0)
{
printf("error to leave\n");
return -1;
}
printf("wait 3 sec\n");
sleep(3);
printf("wake after 3 sec\n");
if(start_thread_func(com_send, &thread[SEND_THREAD_ID_2],"ABCDEFG", &COM_SEND_STATU_2) != 0)
{
printf("error to leave\n");
return -1;
}
printtid();
printf("wait 10 sec\n");
sleep(10);
printf("wake after 10 sec\n");
stop_thread_func(&thread[READ_THREAD_ID_1], &COM_READ_STATU_1);
stop_thread_func(&thread[SEND_THREAD_ID_1], &COM_SEND_STATU_1);
stop_thread_func(&thread[READ_THREAD_ID_2], &COM_READ_STATU_2);
stop_thread_func(&thread[SEND_THREAD_ID_2], &COM_SEND_STATU_2);
return 0;
}
// #include<pthread.h>
// #include<stdio.h>
// #include<sys/time.h>
// #include<string.h>
// #include<termios.h>
// #include<sys/stat.h>
// #include<fcntl.h>
// #include <stdlib.h> //exit()
// #include<unistd.h> //sleep
// #define BAUDRATE B115200
// #define MODEMDEVICE "/dev/pts/4"
// #define R_BUF_LEN (256)
// void printtid(void);
// void* com_read(void* pstatu)
// {
// printtid();
// int i=0;
// int fd,c=0,num;
// struct termios oldtio,newtio;
// char buf[R_BUF_LEN];
// printf("start...\n");
// /*打开PC机的COM1通信端口*/
// fd=open(MODEMDEVICE,O_RDWR | O_NOCTTY | O_NONBLOCK/*| O_NDELAY*/);
// if(fd<0)
// {
// perror(MODEMDEVICE);
// exit(1);
// }
// printf("open ...\n");
// /*将目前终端机的结构保存至oldtio结构*/
// tcgetattr(fd,&oldtio);
// /*清除newtio结构,重新设置通信协议*/
// bzero(&newtio,sizeof(newtio));
// /*通信协议设为8N1,8位数据位,N没有效验,1位结束位*/
// newtio.c_cflag = BAUDRATE |CS8|CLOCAL|CREAD;
// newtio.c_iflag = IGNPAR;
// newtio.c_oflag = 0;
// /*设置为正规模式*/
// newtio.c_lflag=ICANON;
// /*清除所有队列在串口的输入*/
// tcflush(fd,TCIFLUSH); /*新的termios的结构作为通信端口的参数*/
// tcsetattr(fd,TCSANOW,&newtio);
// printf("reading...\n");
// while(*(int*)pstatu)
// {
// num = read(fd,buf, R_BUF_LEN);
// buf[R_BUF_LEN-1] = 0;
// if(num > 0 && num <= R_BUF_LEN)
// {
// buf[num]=0;
// printf("%s", buf);
// fflush(stdout);
// }
// }
// printf("close...\n");
// close(fd);
// /*恢复旧的通信端口参数*/
// tcsetattr(fd,TCSANOW,&oldtio);
// }
// void* com_send(void* p)
// {
// printtid();
// int fd,c=0;
// struct termios oldtio,newtio;
// char ch;
// static char s1[20];
// printf("Start...\n");
// /*打开arm平台的COM1通信端口*/
// fd=open(MODEMDEVICE,O_RDWR | O_NOCTTY);
// if(fd<0)
// {
// perror(MODEMDEVICE);
// exit(1);
// }
// printf(" Open...\n");
// /*将目前终端机的结构保存至oldtio结构*/
// tcgetattr(fd,&oldtio);
// /*清除newtio结构,重新设置通信协议*/
// bzero(&newtio,sizeof(newtio));
// /*通信协议设为8N1*/
// newtio.c_cflag =BAUDRATE |CS8|CLOCAL|CREAD; //波特率 8个数据位 本地连接 接受使能
// newtio.c_iflag=IGNPAR; //忽略奇偶校验错误
// newtio.c_oflag=0;
// /*设置为正规模式*/
// newtio.c_lflag=ICANON; //规范输入
// /*清除所有队列在串口的输出*/
// tcflush(fd,TCOFLUSH);
// /*新的termios的结构作为通信端口的参数*/
// tcsetattr(fd,TCSANOW,&newtio);
// printf("Writing...\n");
// while(*(char*)p != 0)
// {
// int res = 0;
// res = write(fd,(char*)p, 1);
// if(res != 1) printf("send %c error\n", *(char*)p);
// else printf(" %c ", *(char*)p);
// ++p;
// }
// printf("\nClose...\n");
// close(fd);
// /*还原旧的通信端口参数*/
// tcsetattr(fd,TCSANOW,&oldtio);
// printf("leave send thread\n");
// }
// /*
// 开始线程
// thread_fun 线程函数
// pthread 线程函数所在pthread变量
// par 线程函数参数
// COM_STATU 线程函数状态控制变量 1:运行 0:退出
// */
// int start_thread_func(void*(*func)(void*), pthread_t* pthread, void* par, int* COM_STATU)
// {
// *COM_STATU = 1;
// memset(pthread, 0, sizeof(pthread_t));
// int temp;
// /*创建线程*/
// if((temp = pthread_create(pthread, NULL, func, par)) != 0)
// printf("线程创建失败!\n");
// else{
// int id = pthread_self();
// printf("线程%lu被创建\n", *pthread);
// }
// return temp;
// }
// /*
// 结束线程
// pthread 线程函数所在pthread变量
// COM_STATU 线程函数状态控制变量 1:运行 0:退出
// */
// int stop_thread_func(pthread_t* pthread, int* COM_STATU)
// {
// printf("prepare stop thread %lu\n", *pthread);
// *COM_STATU = 0;
// if(*pthread !=0)
// {
// pthread_join(*pthread, NULL);
// }
// printf("线程%d退出!\n", *COM_STATU);
// }
// void printtid(void)
// {
// int id = pthread_self();
// printf("in thread %u\n", id);
// }
// int main()
// {
// printf("读取设备为:%s\n",MODEMDEVICE);
// pthread_t thread[4];
// printtid();
// const int Serial1_READ_THREAD_ID = 0;
// const int Serial1_SEND_THREAD_ID = 1; // 数组下标变量
// int COM_READ_STATU = 0;
// int COM_SEND_STATU = 0;
// if(start_thread_func(com_send, &thread[Serial1_SEND_THREAD_ID],"FF C7 03 A3 A0", &COM_SEND_STATU) != 0)
// {
// printf("error to leave\n");
// return -1;
// }
// printf("wait 3 sec\n");
// sleep(3);
// printf("wake after 3 sec\n");
// if(start_thread_func(com_read, &thread[Serial1_READ_THREAD_ID], &COM_READ_STATU, &COM_READ_STATU) != 0)
// {
// printf("error to leave\n");
// return -1;
// }
// printf("wait 5 sec\n");
// sleep(3);
// printf("wake after 5 sec\n");
// // stop_thread_func(&thread[Serial1_READ_THREAD_ID], &COM_READ_STATU);
// // stop_thread_func(&thread[Serial1_SEND_THREAD_ID], &COM_SEND_STATU);
// return 0;
// }
简单的记录如上,稍后有问题会更新的。