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

代码如下:

#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. 简单字符串处理 hdu2532 Engine

    本来可以把这篇文章放入上一篇文章里,不过做这个题花了一点时间,也有一点收获,同时觉得网上的这个题目可供参考的文章有些少,那么就单独成篇吧. 首先分析下题目思路: 这个题目是个模拟题,步骤也很清晰. 首 ...

  2. 利用ant的javac任务来编译java程序

    <?xml version="1.0" encoding="UTF-8"?> <project name="javaTest&quo ...

  3. 通过xml生成word文档

    Xml生成word总结 使用xml生成word的基本步骤在<使用xslt转化xml数据形成word文档导出.doc>中说明比较清楚了.但是其中的细节并未说到,因此自己折腾了两天总算成功了. ...

  4. docker学习笔记6:利用dockerfile创建镜像介绍(生成简单web服务器镜像)

    本文介绍如何利用dockerfile来创建镜像.下面介绍具体的操作过程: 一.创建构建环境 操作示例如下: xxx@ubuntu:~$ pwd /home/xxx xxx@ubuntu:~$ mkdi ...

  5. android-studio 安装gradle

    http://services.gradle.org/distributions 下载需要的gradle 放到C:\Users\Administrator\.gradle\wrapper\dists\ ...

  6. printf格式控制详解

    format 参数输出的格式,定义格式为 %[flags][width][.precision][length]specifier specifier在最后面.定义了数据类型. Where the s ...

  7. 最小生成树(MST)[简述][模板]

    Prim(添点法) 1. 任选一点(一般选1), 作为切入点,设其与最小生成树的距离为0(实际上就是选一个点,将此树实体化),. 2. 在所有未选择的点中选出与最小生成树距离最短的, 累计其距离, 并 ...

  8. 小胖说事24-----property&#39;s synthesized getter follows Cocoa naming convention for returning &#39;owned&#39; objec

    今天在给类的属性命名的时候,用了newValue.就给报错:property's synthesized getter follows Cocoa naming convention for retu ...

  9. Python 获取时间戳

    Python 获取时间通过 time 模块 如下代码,是通过获取当前的时间,按照格式输出 Python默认获取当前的时间返回的都是时间的元组,下面是元组的,字符串时间的一个转换输出 # -*- cod ...

  10. PHP $_SERVER

    $_SERVER 是一个包括了诸如头信息(header).路径(path).以及脚本位置(script locations)等等信息的数组.这个数组中的项目由 Web server创建.不能保证每一个 ...