Linux 多线程串口通信
大概流程就是打开一个串口、然后进行串口设置。开启二个线程,一个线程写数据,另一个线程读数据。
代码如下:
#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 多线程串口通信的更多相关文章
- linux下串口通信与管理
linux下的串口与windows有一些区别,下面将介绍一下linux下串口通信管理 查看是否支持USB串口: #lsmod | grep usbserial 如果没有信息:sudo apt-get ...
- 多线程串口通信 MFC CSerialPort
写在前面: 晚上应该继续完成未写完的代码,但Chrome上打开的标签实在太多了,约30个了,必须关掉一些,所以需要把自己看的整理一下然后关掉.本次主要写点MFC环境下多线程串口通信相关的东西,这包括线 ...
- Linux下串口通信工具minicom的用法
一.查看串口设备 例如,将USB转串口线插入交换机Console口后,执行命令:$ll /dev/ttyUSB* 二.连接串口设备 $sudo minicom -D /dev/ttyUSB0 三.设置 ...
- Qt串口通信专题教程
查看以前的教程:Qt编写串口通信程序全程图文讲解 查看Wincom和Lincom介绍:Qt跨平台串口通信软件Wincom与Lincom 下载软件,文档和源码:资源下载 ——————————————20 ...
- Qt 串口通信 高速发送出错的解决方法总结
使用网上的qextserialport-1.2类,自行开发多线程串口通信.开发的过程中,出现两个问题: 问题1:我用信号槽跨线程调用串口类MyCom 发送和接收数据,中间运行的时候,会内存错误,Q ...
- linux下的qt串口通信
1.linux下的qt串口通信跟windows唯一的差别就是端口号的名字,windows下面是COM,而linux是ttyUSB0的路径 2.一般情况下linux插上USB转串口线就可以在/dev/目 ...
- Linux与Windows串口通信
串口是常用的计算机与外部串行设备之间的数据传输通道,由于串行通信方便易行,所以应用广泛.现在国际上不断有串口新技术及新规格推出,结合社会各方面需要,串口通信发展的空间庞大.串口通讯技术因其自身的优势和 ...
- Linux 虚拟串口及 Qt 串口通信实例
Linux 虚拟串口及 Qt 串口通信实例 2011-06-22 17:49 佚名 互联网 字号:T | T Linux 虚拟串口及 Qt 串口通信实例是本文所要介绍的内容,在实现过程中,打开了两个伪 ...
- 多线程CSerialPort类的多串口通信实现
多线程CSerialPort类的多串口通信实现 工作了之后才发现,之前在学校里真是狭隘封闭.坐井观天,拿之前发表的论文来说,工作后接触到了底层的串口.网口开发,对线程(也叫任务).操作系统时间片轮流 ...
随机推荐
- 【转】如何在CentOS/RHEL中安装基于Web的监控系统 linux-das
Linux-dash是一款为Linux设计的基于Web的轻量级监控面板.这个程序会实时显示各种不同的系统属性,比如CPU负载.RAM使用率.磁盘使用率.网速.网络连接.RX/TX带宽.登录用户.运行的 ...
- 在mac os 中安装 autoconf and automake
转载地址:http://www.mattvsworld.com/blog/2010/02/install-the-latest-autoconf-and-automake-on-mac-os-10-6 ...
- Android项目实战手机安全卫士(01)
目录 项目结构图 源代码 运行结果 项目结构图 源代码 SplashActivity.java package com.coderdream.mobilesafe.activity; import a ...
- Android之——Fragment生命周期(日志截图版)
转载请注明出处:http://blog.csdn.net/l1028386804/article/details/46867159
- 《C++ Primer Plus》学习笔记1
C++ Primer Plus>学习笔记1 第二章.開始学习C++ 1.控制符endl 假设显示字符串时,在字符串中包括换行符,而不是在末尾加上endl,这样能够大大降低输入量:假设是要生成一个 ...
- 更改ORACLE 用户的 expired状态
oracle中, 经常用户的状态会变成locked, expired 等状态, 这种情况下怎么处理呢? 首先, 如果是locked状态还好办, DBA直接执行alter user scott acco ...
- Ubuntu中查看硬盘分区UUID的方法(所有Linux目录的解释)
在Ubuntu中UUID的两种获取方法,至于UUID是什么,你可以大概理解为分区的标识符,像条形码那样. 在终端中输入下面的命令就可心查看到分区UUID了.命令1.sudo blkid 命令2.ls ...
- Android 之 Fragment
一 左侧标题列表 1.1 布局 left_fragment.xml <ListView xmlns:android="http://schemas.android.com/apk/ ...
- RAC 11.2.0.4 安装 遇到 INS-06001
今天安装11.2.0.4的grid软件,在配置passwordless SSH的时候,点击setup 出现此错误 开始网上搜了一把.说什么的都有,什么系统bug啊什么的 但是我另外一套rac却很正常就 ...
- PS大头照的背景
给同事ps一个大头照,只是修改一下背景颜色,以前没有做过,这次算是小练习了一把,与大家分享一下.修改大头照背景重要的是如何选中背景的区域,如果用魔棒选择的话,头与背景的边处理的不好,说说我的处理方法吧 ...