大概流程就是打开一个串口、然后进行串口设置。开启二个线程,一个线程写数据,另一个线程读数据。

代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <errno.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <termios.h>
#include <pthread.h>
#include <sys/time.h> #define MAX 2
pthread_t thread[2];
pthread_mutex_t mut;
int fd; int set_port(int fd,int nbits)
{
struct termios newtio,oldtio;
if(tcgetattr(fd,&oldtio)!=0)
{
perror("pei zhi cuo wu1\n");
return -1;
} bzero(&newtio,sizeof(newtio)); //清零
newtio.c_cflag |=CLOCAL|CREAD;//用于本地连接和接收使能 newtio.c_cflag &=~CSIZE;//设置数据位
switch(nbits)
{
case 7:
newtio.c_cflag |=CS7;break;
case 8:
newtio.c_cflag |=CS8;break;
} //设置奇校验位
newtio.c_cflag |=PARENB; //设置波特率
cfsetispeed(&newtio,B115200);
cfsetospeed(&newtio,B115200); //设置停止位
newtio.c_cflag &=~PARENB; if((tcsetattr(fd,TCSANOW,&newtio))!=0)
{
perror("pei zhi cuo wu2\n");
return -1;
} printf("bao cun wan bi \n");
return 0;
} void *thread1()
{
int i;
printf ("thread1 \n");
for( i=0;i<MAX;i++){
pthread_mutex_lock(&mut);
if(i==0){
printf("write %d\n",i+1);
char buf1[]="AT+FCLASS=0\r\n";
int length=sizeof(buf1);
int j=write(fd,buf1,length);
puts(buf1);
if(j<0)printf("fa song shi bai\n");
printf("%d \n",j);
}
else if(i==1){
printf("write %d\n",i+1);
char buf2[]="AT+CBST=7,0,0\r\n";
int length=sizeof(buf2);
int j=write(fd,buf2,length);
puts(buf2);
if(j<0)printf("fa song shi bai\n");
printf("%d \n",j); }
sleep(3);
pthread_mutex_unlock(&mut);
}
printf("thread1 stop\n");
pthread_exit(NULL); } void *thread2()
{
int j;
sleep(1);
printf("thread2\n");
char buf[100];
for (j = 0; j< MAX; j++)
{
pthread_mutex_lock(&mut);
sleep(3);
printf("read %d\n",j+1);
int k=read(fd,buf,100);
printf("k+%d\n",k);
puts(buf);
pthread_mutex_unlock(&mut);
sleep(2);
}
printf("thread2 :stop\n");
pthread_exit(NULL); } void thread_create(void)
{
int temp;
memset(&thread, 0, sizeof(thread)); //comment1
/*创建线程*/
if((temp = pthread_create(&thread[0], NULL, thread1, NULL)) != 0) //comment2
printf("xian chegn 1 faile\n");
else
printf("xian cheng 1 chegn gong\n"); if((temp = pthread_create(&thread[1], NULL, thread2, NULL)) != 0) //comment3
printf("2 faile\n");
else
printf("2 surcess\n");
} void thread_wait(void)
{
/*等待线程结束*/
if(thread[0] !=0) { //comment4
pthread_join(thread[0],NULL);
printf("1 stop \n");
}
if(thread[1] !=0) { //comment5
pthread_join(thread[1],NULL);
printf("2 stop \n");
}
} int main(void) {
int i,j,k;
fd=open("/dev/ttyS2",O_RDWR|O_NOCTTY|O_NDELAY);
if(-1==fd)printf("mei da kai tong xin duan kou hao\n");
else
{
i=set_port(fd, 8);
if(i<0)
{
perror("pei zhi cuo wu3\n");
return 0;
}
pthread_mutex_init(&mut,NULL);
printf("creat preadth\n");
thread_create();
printf("chu li \n");
thread_wait();
close(fd);
}
return 0; }

  

Linux 多线程串口通信的更多相关文章

  1. linux下串口通信与管理

    linux下的串口与windows有一些区别,下面将介绍一下linux下串口通信管理 查看是否支持USB串口: #lsmod | grep usbserial 如果没有信息:sudo apt-get ...

  2. 多线程串口通信 MFC CSerialPort

    写在前面: 晚上应该继续完成未写完的代码,但Chrome上打开的标签实在太多了,约30个了,必须关掉一些,所以需要把自己看的整理一下然后关掉.本次主要写点MFC环境下多线程串口通信相关的东西,这包括线 ...

  3. Linux下串口通信工具minicom的用法

    一.查看串口设备 例如,将USB转串口线插入交换机Console口后,执行命令:$ll /dev/ttyUSB* 二.连接串口设备 $sudo minicom -D /dev/ttyUSB0 三.设置 ...

  4. Qt串口通信专题教程

    查看以前的教程:Qt编写串口通信程序全程图文讲解 查看Wincom和Lincom介绍:Qt跨平台串口通信软件Wincom与Lincom 下载软件,文档和源码:资源下载 ——————————————20 ...

  5. Qt 串口通信 高速发送出错的解决方法总结

    使用网上的qextserialport-1.2类,自行开发多线程串口通信.开发的过程中,出现两个问题:   问题1:我用信号槽跨线程调用串口类MyCom 发送和接收数据,中间运行的时候,会内存错误,Q ...

  6. linux下的qt串口通信

    1.linux下的qt串口通信跟windows唯一的差别就是端口号的名字,windows下面是COM,而linux是ttyUSB0的路径 2.一般情况下linux插上USB转串口线就可以在/dev/目 ...

  7. Linux与Windows串口通信

    串口是常用的计算机与外部串行设备之间的数据传输通道,由于串行通信方便易行,所以应用广泛.现在国际上不断有串口新技术及新规格推出,结合社会各方面需要,串口通信发展的空间庞大.串口通讯技术因其自身的优势和 ...

  8. Linux 虚拟串口及 Qt 串口通信实例

    Linux 虚拟串口及 Qt 串口通信实例 2011-06-22 17:49 佚名 互联网 字号:T | T Linux 虚拟串口及 Qt 串口通信实例是本文所要介绍的内容,在实现过程中,打开了两个伪 ...

  9. 多线程CSerialPort类的多串口通信实现

    多线程CSerialPort类的多串口通信实现  工作了之后才发现,之前在学校里真是狭隘封闭.坐井观天,拿之前发表的论文来说,工作后接触到了底层的串口.网口开发,对线程(也叫任务).操作系统时间片轮流 ...

随机推荐

  1. c# 课堂总结7--函数

    函数:数据类型-变量类型-运算符号表达式-语句(顺序,分支,循环)-数字 程序里的函数:能完成一个相对独立功能的代码块.数学里的函数:高度抽象.函数四要素:函数名,输入(参数),输出(返回值类型),加 ...

  2. 80端口的烦恼:[3]清除NT Kernel占用80端口

    链接地址:http://jingyan.baidu.com/article/f96699bbca15a1894e3c1bc4.html 当一台电脑安装了vs又安装了xampp时,可以能发生80端口号冲 ...

  3. ffmpeg h265

    最新版本号的ffmpeg 支持 libh265,可是还是0基础測试阶段 在linux 上安装ffmpeg 支持h265编码器依照下面步骤: Anyhow here are the simple ste ...

  4. HDU 4836 The Query on the Tree lca || 欧拉序列 || 动态树

    lca的做法还是非常明显的.简单粗暴, 只是不是正解.假设树是长链就会跪,直接变成O(n).. 最后跑的也挺快,出题人还是挺阳光的.. 动态树的解法也是听别人说能ac的.预计就是放在splay上剖分一 ...

  5. NHibernate - HQL - 添加和更改

    添加: /// <summary> /// 等待乙方做出回应 A /// </summary> private void button2_Click_1(object send ...

  6. c语言,变长数组

    下面这个结构体,可以在malloc的时候指定数据data的长度,这样的形式就是变长数组:typedef struct{ int data_len; char data[0];//或char data[ ...

  7. BZOJ 3545: [ONTAK2010]Peaks( BST + 启发式合并 + 并查集 )

    这道题很好想, 离线, 按询问的x排序从小到大, 然后用并查集维护连通性, 用平衡树维护连通块的山的权值, 合并就用启发式合并.时间复杂度的话, 排序是O(mlogm + qlogq), 启发式合并是 ...

  8. Troubleshooting:oVirt-engine

    问题:执行./create_db_devel.sh -u postgres创建数据库时出错 描述: [root@localhost dbscripts]# ./create_db_devel.sh - ...

  9. Ubuntu 挂载ISO文件的方法

    1.在终端中输入:sudo mkdir /media/iso 在/media下生成一个iso文件夹用来挂载iso文件2.然后输入:sudo mount -o loop /home/X/X/XXXX.i ...

  10. wireshark删除filters记录