Linux环境下2410开发板串口读写关键代码
今天偶然整理原来的项目开发文档,找到了曾经在2410开发板上做的串口读写程序的代码。
现在贴出来供大家参考。
#include <qtopia/qpeapplication.h>
/************************************/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <errno.h>
/***********************************/
#include <pthread.h>
#include <qnamespace.h>
int argc;
char **argv;
int fd,rc,ii,ret;
char rbuf[8];
char wbuf[8]="12345";
/****************/
int file,size,len;
int tmp_id=0;
int id_count=0;//已经收到的ID,计数
/****************/
char *dev ="/dev/ttyS1"; //串口号 /dev/ttyS1 对应于串口1
int openport(char *Dev)
{
int fd = open( Dev, O_RDWR|O_NOCTTY|O_NDELAY );
if (-1 == fd)
{
perror("Can''t Open Serial Port");
return -1;
}
else
return fd;
}
int setport(int fd, int baud,int databits,int stopbits,int parity)
{
int baudrate;
struct termios newtio;
switch(baud)
{
case 300:
baudrate=B300;
break;
case 600:
baudrate=B600;
break;
case 1200:
baudrate=B1200;
break;
case 2400:
baudrate=B2400;
break;
case 4800:
baudrate=B4800;
break;
case 9600:
baudrate=B9600;
break;
case 19200:
baudrate=B19200;
break;
case 38400:
baudrate=B38400;
break;
default :
baudrate=B9600;
break;
}
tcgetattr(fd,&newtio);
bzero(&newtio,sizeof(newtio));
//setting c_cflag
newtio.c_cflag &=~CSIZE;
switch (databits) /*设置数据位数*/
{
case 7:
newtio.c_cflag |= CS7; //7位数据位
break;
case 8:
newtio.c_cflag |= CS8; //8位数据位
break;
default:
newtio.c_cflag |= CS8;
break;
}
switch (parity) //设置校验
{
case 'n':
case 'N':
newtio.c_cflag &= ~PARENB; /* Clear parity enable */
newtio.c_iflag &= ~INPCK; /* Enable parity checking */
break;
case 'o':
case 'O':
newtio.c_cflag |= (PARODD | PARENB); /* 设置为奇效验*/
newtio.c_iflag |= INPCK; /* Disnable parity checking */
break;
case 'e':
case 'E':
newtio.c_cflag |= PARENB; /* Enable parity */
newtio.c_cflag &= ~PARODD; /* 转换为偶效验*/
newtio.c_iflag |= INPCK; /* Disnable parity checking */
break;
case 'S':
case 's': /*as no parity*/
newtio.c_cflag &= ~PARENB;
newtio.c_cflag &= ~CSTOPB;break;
default:
newtio.c_cflag &= ~PARENB; /* Clear parity enable */
newtio.c_iflag &= ~INPCK; /* Enable parity checking */
break;
}
switch (stopbits)//设置停止位
{
case 1:
newtio.c_cflag &= ~CSTOPB; //1
break;
case 2:
newtio.c_cflag |= CSTOPB; //2
break;
default:
newtio.c_cflag &= ~CSTOPB;
break;
}
newtio.c_cc[VTIME] = 0;
newtio.c_cc[VMIN] = 0;
newtio.c_cflag |= (CLOCAL|CREAD);
newtio.c_oflag|=OPOST;
newtio.c_iflag &=~(IXON|IXOFF|IXANY);
cfsetispeed(&newtio,baudrate);
cfsetospeed(&newtio,baudrate);
tcflush(fd, TCIFLUSH);
if (tcsetattr(fd,TCSANOW,&newtio) != 0)
{
perror("SetupSerial 3");
return -1;
}
return 0;
}
int readport(int fd,char *buf,int len,int maxwaittime)//读数据,参数为串口,BUF,长度,超时时间
{
int no=0;int rc;int rcnum=len;
struct timeval tv;
fd_set readfd;
tv.tv_sec=maxwaittime/1000; //SECOND
tv.tv_usec=maxwaittime%1000*1000; //USECOND
FD_ZERO(&readfd);
FD_SET(fd,&readfd);
rc=select(fd+1,&readfd,NULL,NULL,&tv);
if(rc>0)
{
while(len)
{
rc=read(fd,&buf[no],1);
if(rc>0)
no=no+1;
len=len-1;
}
if(no!=rcnum)
return -1; //如果收到的长度与期望长度不一样,返回-1
return rcnum; //收到长度与期望长度一样,返回长度
}
else
{
return -1;
}
return -1;
}
void writeport(int fd,char *buf,int len) //发送数据
{
write(fd,buf,len);
}
void clearport(int fd) //如果出现数据与规约不符合,可以调用这个函数来刷新串口读写数据
{
tcflush(fd,TCIOFLUSH);
}
void *thread1(void *)
{
//线程 1
while(1)
{
rbuf[0]='\0';
/*超时太长,会丢失数据包,如果连续*/
rc=readport(fd,rbuf,5,50); //读取5个字节,超时时间为100,500毫秒
if(rc!=-1)
{
rbuf[5]='\0';
//writeport(fd,wbuf,rc);
writeport(fd,rbuf,rc); //把收到的数据 发回
printf("Rev id:%s\n",rbuf);
}
//else
//{
// printf("Lost recv:%d\t Lost Text:%s\n",rc,rbuf);
// writeport(fd,wbuf,rc);
//}
}
close(fd); //关闭串口
pthread_exit(0);
}
void *thread2(void *)
{
QPEApplication a( argc, argv );
HelloForm f(0,"yunfly",Qt::WStyle_Customize|Qt::WStyle_NoBorder);
a.showMainWidget( &f );
//int result=a.exec();
a.exec();
pthread_exit(0);
}
int main( int a_rgc, char *a_rgv[] )
{
argc=a_rgc;
argv=a_rgv;
/********************初始化串口*************************/
// for(ii=0;ii<256;ii++)wbuf[ii]=ii;
fd=openport(dev); //打开串口
if(fd>0){
ret=setport(fd,115200,8,1,'N'); //设置串口,波特率,数据位,停止位,校验
if(ret<0){
printf("Can't Set Serial Port!\n");
exit(0);
}
}
else
{
printf("Can't Open Serial Port!\n");
exit(0);
}
/*****************************************************/
pthread_t id1,id2;
int ret;
/*Create Thread 1: RS232 Serial */
ret=pthread_create(&id1,NULL,thread1,NULL);
if(ret!=0){
printf("Create pthread error!\n");
exit(1);
}
/*Create Thread 2:QT Window*/
ret=pthread_create(&id2,NULL,thread2,NULL);
if(ret!=0){
printf("Create pthread error!\n");
exit(1);
}
pthread_join(id1,NULL);
pthread_join(id2,NULL);
exit(0);
}
关键函数解释:
(1)串口打开函数
在Linux 下,设备都被看成是“文件”,因此打开一个串口,就是打开一个文件。
int fd= open(文件,文件读写方式)
例如:
开发板上的串口0是 /dev/ttyS0
开发板上的串口1是 /dev/ttyS1
同样,在PC机上的串口也是一样。
(2)串口设置函数
int setport(int fd, int baud,int databits,int stopbits,int parity)
该函数主要是设置串口波特率、校验码等
(3)查询法读取串口数据
maxwaittime为最大等待时间,也就是超时时间,buf为数据接收缓冲区
(4)串口数据写入函数
(5)线程函数
因为采用查询法获取串口数据,如果采用单线程的话,QT主界面将被阻塞了,无法操作。因此,这里设置了2个线程。一个线程启动QT界面,一个线程负责串口接收数据。
小结:
以上的办法不是最好的,只是实现起来相对简单。如果是做应用的话,建议采用串口中断读取数据。
转载于:https://www.cnblogs.com/hgndinfo/archive/2012/02/08/2713941.html
Linux环境下2410开发板串口读写关键代码相关推荐
- Linux环境下ARM开发工具TrueSTUDIO初体验
Linux环境下ARM开发工具TrueSTUDIO初体验 TrueSTUDIO是Atollic公司出品的ARM开发工具,号称"The best FREE C/C++ IDE for ARM® ...
- Linux环境下Android开发环境的搭建
本文主要介绍在Ubuntu下Android开发环境的搭建,所使用的IDE为Eclipse(Android Studio同理,且可省去配置SDK以及安装adt插件的步骤). 1.安装JDK (1)JDK ...
- linux下读写ntfs硬盘吗,Linux环境下实现NTFS分区完全读写的方法
可能大多数人对 Linux 访问 NTFS 的印象还是'只读,写会很危险',其实从 ntfsmount 开始,就能够安全的在 NTFS 上写文件,或者创建文件了.现在发布的是在 ntfsmount 基 ...
- linux环境下java开发_Linux Ubuntu系统下Java开发环境搭建
软件151田杰中 2. 在合适的路径下创建文件夹用来存储Java JDK,本例选择在/opt目录下新建JVM子文件夹.操作如下 打开Terminal(后文成为T1),输入: cd /opt ...
- android 板串口路径,Android开发板串口读写操作
首先,把com.friendlyarm.AndroidSDK包(自己下载)添加到项目中. //打开串口,返回串口描述符fd fd = HardwareControler.openSerialPort( ...
- WSL+VSCODE体验UBUNTU环境下的开发
首先安装 WSL,我这里选择的是 ubuntu18.04 这个应用. 切换 WSL 的默认用户为 root 用户 切换成 root 用户主要是避免后续开发中遇到权限问题比较麻烦,直接默认 root 解 ...
- Ubuntu Linux环境下的Android开发环境的配置
在Android底层开发中需要用到的工具有:JDK6或以上版本:Eclipse3.4或以上版本:ADT;CDT;Android SDK:Android NDK:交叉编译环境:Linux内核源代码:An ...
- ubuntu下S5PV210开发板嵌入式开发环境搭建
本教程所使用的开发板是GEC210开发板,核心板资源概述:CPU:S5PV210,SDRAM:512MB,Flash:8MB,NandFlash:256MB. 本教程搭建的环境可以用于uboot移植. ...
- Linux创建线程读取双口数据,linux环境下读写一次双口ram尽然要十几个毫秒。(附驱动代码)...
linux环境下读写一次双口ram尽然要十几个毫秒.(附驱动代码) 我用的双口ram是IDT70V28,手册上说的读写时间应该是几个纳秒,我写了个linux驱动,然后做测试,发现读写一次的时间尽然是十 ...
最新文章
- 循环中 动态参数 传div 层_【转载】黄学杰等:铌元素在锂离子电池中的应用
- IDEA直接跳转到方法的实现类快捷键
- Vue-router(二) 子路由(嵌套路由)
- iOS_TableView的相关操作
- LINUX系统中动态链接库的创建和使用
- 逻辑回归(LR)个人学习总结篇
- IOS-项目中常见文件介绍
- 帆软自定义登录html,自定义登陆界面- FineReport帮助文档|报表开发|报表使用|学习教程...
- 2021年电工(初级)考试试卷及电工(初级)考试平台
- 学建模从软件开始,8款超级好用的3d建模软件
- excel表格打印每页都有表头_excel单页表格打印带连续页码的多页
- 【阅读笔记】Mutual CRF-GNN for Few-shot Learning
- 隆重纪念鲁宾逊诞辰,不走样,不离谱
- 抖音、腾讯世纪大和解,透露了哪些信息?
- C语言标准库里的获取时间函数及时间格式转换详解
- nodejs入门04__包的创建和发布
- 计算机病毒和木马完全相同,木马和计算机病毒的特点
- Qt信号和槽函数连接不成功原因
- 人生之路小游戏代码2
- Linux基础命令入门
热门文章
- android源码国内镜像,Fuchsia OS 源代码国内镜像上线
- 知识图谱组队学习Task02——项目介绍
- 矿区无人机影像地物提取(语义分割)
- 卷积神经网络的卷积核大小、个数,卷积层数如何确定呢?
- php mvc vue 调用js函数_js 匿名函数自调用
- asp手机拍照显示_设备 | UNIJET募资约6600万元,用于大尺寸显示领域的新一代喷墨打印技术...
- 中国智能卡市场的新机会
- git pull远程master_github与Git实用操作图解之一
- web前端(2)——了解什么是前端,以及与后端的关系
- Fiddler4入门--手机抓包工具安装和使用说明