vxworks下的串口测试程序
VXWORKS串口设置说明:
一般有这么几步:
打开串口
设置串口raw模式,清空输入输出的缓冲区
设置波特率,数据位,停止位,校验方式
便可以开始读和写
打开串口:
fd = open("/tyCo/0", O_RDWR, 0);
"/tyCo/0" 串口1的设备名,O_RDWR:open for reading and writing
设置串口raw模式,清空输入输出的缓冲区
ioctl(fd,FIOSETOPTIONS,OPT_RAW);
ioctl(fd,FIOFLUSH,0);
ioctl(int fd,int function,int arg);这个函数解释如下:
function这个参数有如下:(tty)
|
FIOBAUDRATE |
设置波特率,arg为一整数,表示要设定的波特率 |
|
FIOGETOPTIONS |
取得设备控制字,arg表示读出的内容存放的位置 |
|
FIOSETOPTIONS |
设置设备控制字,arg表示要设置的选项 |
|
FIOGETNAME |
取得文件描述符对应的文件名,arg存放文件名的缓冲区 |
|
FIOREAD |
取得输入缓冲区内未读取的字符数,arg用于接收结果的整型指针 |
|
FIOWRITE |
取得输出缓冲区内的字符个数,arg用于接收结果的整型指针 |
|
FIOFLUSH |
清空输入输出缓冲区的字符 |
|
FIOCANCEL |
取消读和写 |
FIOSETOPTIONS对应的arg有 OPT_LINE,OPT_RAW,OPT_ECHO等等
关于这些的定义,可以在sioLib.h,ioLib.h里寻找。
设置波特率,数据位,停止位,校验方式
STOPB:两位停止位,默认是1位停止位。PARENB使能校验,PARODD奇校验,使能后默认是偶校验,未使能则是无校验
CS5,CS6,CS7,CS8:5,6,7,8位数据位
如:CS8|PARENB :8位数据位,1位停止位,偶校验;
CS8|PARENB|PARODD:8位数据位,1位停止位,奇校验;
CS8 :8位数据位,1位停止位,无校验;
CS8|STOPB:8位数据位,2位停止位,无校验;
int SerialOps = 0;
ioctl(fd,FIOBAUDRATE,9600); //9600波特率
SerialOps |= CS8;//8数据位,1位停止位,无校验
ioctl(fd,SIO_HW_OPTS_SET,SerialOps);//设置
SIO_HW_OPTS_SET(设置硬件选项)是在XXDrv里的function
SIO_HW_OPTS_SET对应的arg:
|
CLOCAL |
忽略modem控制信号 |
|
CREAD |
启动接收器 |
|
CSIZE |
指定数据位:CS5~CS8 |
|
HUPCL |
最后关闭时挂断modem连接 |
|
STOPB |
被设置时指定2位停止位,否则1位停止位 |
|
PARENB |
被设置时启用奇偶校验,否则不进行奇偶校验 |
|
PARODD |
被设置时启用奇校验,否则偶校验 (PARENB被设置时才有效) |
可以开始读写
int read
(
int fd, /* file descriptor from which to read */
char * buffer, /* pointer to buffer to receive bytes */
size_t maxbytes /* max no. of bytes to read into buffer */
)
int write
(
int fd, /* file descriptor on which to write */
char * buffer, /* buffer containing bytes to be written */
size_t nbytes /* number of bytes to write */
)
关于串口的设置,需要参考tty和xxDrv。详细的还是需要看书的。
下面举个例子:在有些的设置需要如下:
fd=open(tyco,2,0);
logMsg("/n%s;fd=%d/n",tyco,fd,0,0,0,0);
ioctl(fd, FIOOPTIONS, OPT_RAW);
ioctl(fd,FIOBAUDRATE,115200); //设置串口波特率为9600bps
ioctl(fd,FIOFLUSH,0);//清空输入输出缓冲
//ioctl(fd,SIO_HW_OPTS_SET,CS8|PARENB|PARODD|CLOCAL|CREAD); //设置 8 位数据位,1位停止位,带校验位,奇校验,没有流控制CLOCAL,使能读CREAD
//ioctl(fd,SIO_HW_OPTS_SET,CS8|PARENB|CLOCAL|CREAD); //设置 8 位数据位,1位停止位,带校验位,偶校验,没有流控制CLOCAL,使能读CREAD
ioctl(fd,SIO_HW_OPTS_SET,CS8|CLOCAL|CREAD); //设置 8 位数据位,1位停止位,带校验位,无校验,没有流控制CLOCAL,使能读CREAD
write(fd,str,48);//需放在清缓存后,mpc8280不用。和SIO_HW_OPTS_SET之后,因为会reset串口
上面粗字体,需要注意。有些需要,有些不需要的。
#include <ioLib.h>
#include <stdio.h>
#include <taskLib.h>
#include <sioLib.h>
#include <string.h>
/*ioctl(com2_Fd,FIOSETOPTIONS,OPT_RAW);*/
int tyRecv(int fd,int fd2)
{
int readCnt1;
char rd;
char buff[512];
int i;
FOREVER
{
i=0;
taskDelay(25);
ioctl(fd,FIONREAD,&readCnt1); /* 判断com1接收数据缓冲区是否有数据到来 */
if(readCnt1>0)
{
while(readCnt1>0)
{
read(fd,&rd,1);
readCnt1--;
buff[i++]=rd;
taskDelay(1);
}
buff[i]='\0';
printf("read1 [%s] \n",buff);
}
i=0;
taskDelay(25);
ioctl(fd2,FIONREAD,&readCnt1); /* 判断com2接收数据缓冲区是否有数据到来 */
if(readCnt1>0)
{
while(readCnt1>0)
{
read(fd2,&rd,1);
readCnt1--;
buff[i++]=rd;
taskDelay(1);
}
buff[i]='\0';
printf("read2 [%s] \n",buff);
}
}
}
int tySend(int fd,int fd2)
{
int wrtCount,i;
char buff[]=" I am god of war!"; /* 发送内容 */
for(i=0;i<10;i++)
{
buff[0] = '1'+i;
wrtCount = write(fd,buff,strlen(buff));
printf("write1 %d bytes \n",wrtCount); /* 写com1口,然后数据就会通过串口直连线发送到com2方了 */
taskDelay(60);
buff[0] = 'a'+i;
wrtCount = write(fd2,buff,strlen(buff));
printf("write2 %d bytes \n",wrtCount); /* 写com2口,然后数据就会通过串口直连线发送到com2方了 */
taskDelay(60);
}
}
int com1_Fd,com2_Fd;
int taskID;
int taskID2;
int test()
{
com1_Fd = open("/tyCo/0",2,0) ; /* 打开串口0,即serial<->com1 */
com2_Fd = open("/tyCo/1",2,0); /* 打开串口1,即serial2<->com2 */
ioctl(com1_Fd,FIOSETOPTIONS,OPT_RAW);
ioctl(com2_Fd,FIOSETOPTIONS,OPT_RAW);
/* 设置串口0,亦即com1的波特率9600,8数据为,1停止位,无校验位 */
if ( ERROR==ioctl(com1_Fd,FIOBAUDRATE,9600) )
{
printf("can not set BAUDRATE!\n") ;
return ERROR ;
}
if ( ERROR==ioctl(com1_Fd,SIO_HW_OPTS_SET,(CLOCAL|CREAD|CS8)&~(HUPCL|STOPB|PARENB)))
{
printf("can not set OPT!\n") ;
return ERROR ;
}
ioctl(com1_Fd,FIOFLUSH,0);
/* 设置串口1,亦即com2的波特率9600,8数据为,1停止位,无校验位 */
if ( ERROR==ioctl(com2_Fd,FIOBAUDRATE,9600) )
{
printf("can not set BAUDRATE!\n") ;
return ERROR ;
}
if ( ERROR==ioctl(com2_Fd,SIO_HW_OPTS_SET,(CLOCAL|CREAD|CS8)&~(HUPCL|STOPB|PARENB)))
{
printf("can not set OPT!\n") ;
return ERROR ;
}
ioctl(com2_Fd,FIOFLUSH,0);
printf("com1:0x%x com2:0x%x!\n",com1_Fd,com2_Fd) ;
/* 发起接受数据的任务 */
taskID = taskSpawn("recv",60,0,0x2000,(FUNCPTR)tyRecv,com1_Fd,com2_Fd,0,0,0,0,0,0,0,0);
/* 发起发送数据的任务*/
taskSpawn("send",80,0,0x2000,(FUNCPTR)tySend,com1_Fd,com2_Fd,0,0,0,0,0,0,0,0);
}
void del()
{
taskDelete(taskID);
/*taskDelete(taskID2);*/
close(com1_Fd);
close(com2_Fd);
}
vxworks下的串口测试程序的更多相关文章
- Linux下的串口编程及非阻塞模式
本篇介绍了如何在linux系统下向串口发送数据.包括read的阻塞和非阻塞.以及select方法. 打开串口 在Linux系统下,打开串口是通过使用标准的文件打开函数操作的. #include < ...
- [小技巧] shell 下查看串口是否工作正常
在 Linux 下调试串口,是个麻烦的事情,尤其是嵌入式环境,很多时候要借助另一台设备来进行调试. 这里琢磨出一种可行的串口调试方法,可以简单的查看串口是否在正确工作. 1. 短接 tx 和 rx,让 ...
- Mac下的串口通信-ORSSerialPort
================================2015/11/05======================================= 最近在工作中遇到有关Mac下串口通信 ...
- vxworks下网络编程一:网络字节序问题
inet_addr("192.168.1.1");//返回网络字节序整型ip地址inet_ntoa(saddr);//将包含网络字节序整型ip地址的in_addr对象转换成本地ch ...
- linux下查看串口信息
rs232串口通信接口:当通信距离较近时(<12m),可以使用电缆线直接连接,若距离较远,需附加调制解调器. 9个脚针的定义: CDC数据载波检测,RXD接收数据,TXD发送数据,DTR数据中断 ...
- MFC下对串口的操作以及定时器的调用
最近研究了一下MFC下对串口的操作,测试了一下对设备的读写. 1.打开串口 GetDlgItem(IDC_BUTTON_OPEN)->EnableWindow(FALSE); m_hComm = ...
- VxWorks下USB驱动总结2
3:USBD驱动详解 这一部分将要描述USBD(USB Host Driver)的典型应用.例如初始化,client注册,动态连接注册,设备配置,数据传输,同时还探讨了USBD内部设计的关键特性.这部 ...
- Vxworks下的SATA提速
1. ATA接口的三种数据传输方式 (1)PIO(Programmable Input-Output)传输,可以分为PIO寄存器传输和PIO数据传输.PIO寄存器传输主要用于对ATA设备中 ...
- vxWorks下dosFs文件系统的创建
.cdromFs:允许系统从按照ISO9660标准文件系统格式化的CD-ROM上读取设备: 通常文件系统驱动位于磁盘(块存取)设备驱动和IO系统之间,这一点在VxWorks中也不例外,但它在此基础上扩 ...
随机推荐
- JAVA泛型使用方法总结
1. 基本概念: (1)什么是泛型? 泛型,即"参数化类型".即将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用或 ...
- MySQL修改密码的三种方法
MySQL修改密码的三种方法 1.方法1: 2.方法2: 3.方法3:
- HDU D Tree [点分治]
传送门 题意:找路径积$\mod 1e6+3 = k$的字典序最小点对 作为一个点分治蒟蒻,写这道题花了两节课.... 显然只要开一个桶$c[i]$记录当前路径积为$i$的最小点 然后处理一个子树时一 ...
- IT连创业系列:年终回顾录!
一年不过一转眼,一光阴的青春又逝去了! 还有不到几天,就要进入新年快乐的祝福包围圈了. 在这归家之际,留文一篇,为这忙碌的一年创业留点回忆! IT连创业这一年走来: 大大小小的深坑,小小大大的困难,一 ...
- 用es6的Array.reduce()方法计算一个字符串中每个字符出现的次数
有一道经典的字符串处理的问题,统计一个字符串中每个字符出现的次数. 用es6的Array.reduce()函数配合“...”扩展符号可以更方便的处理该问题. s='abananbaacnncn' [. ...
- PHP实现session对象封装
<?php class Session { private $db; // 设置数据库变量 private $expiry = 3600; // 设置Session失效时间 public fun ...
- apache服务器主域名跳转www域名
为集中网站权重,有时候我们需要把www域名跳转到主域名,或者主域名跳转到www域名. apache服务器如何实现主域名跳转www域名: 打开网站根目录下.htaccess文件,没有的话新建一个上传至网 ...
- Python:main函数
什么是函数? 一个程序可以包含多个模块,程序越复杂,包含的模块和功能就越多,模块细分里面包含多个类,类这个概念在任何一门面向对象语言里面都很重要,在类里面最主要的就是包含的函数,函数式实现某一个功能的 ...
- My GitHub
0.引言 利用python开发,借助Dlib库捕获摄像头中的人脸,进行实时特征点标定: 图1 工程效果示例(gif) 图2 工程效果示例(静态图片) (实现比较简单,代码量也比较少,适合入门或者兴趣学 ...
- 关于eclipse的mysql连接配置
打开eclipse,选择Window→Open Perspective→Other→Database Development,然后在右边的导航栏右键点击Database Connections文件夹, ...