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下的串口测试程序的更多相关文章

  1. Linux下的串口编程及非阻塞模式

    本篇介绍了如何在linux系统下向串口发送数据.包括read的阻塞和非阻塞.以及select方法. 打开串口 在Linux系统下,打开串口是通过使用标准的文件打开函数操作的. #include < ...

  2. [小技巧] shell 下查看串口是否工作正常

    在 Linux 下调试串口,是个麻烦的事情,尤其是嵌入式环境,很多时候要借助另一台设备来进行调试. 这里琢磨出一种可行的串口调试方法,可以简单的查看串口是否在正确工作. 1. 短接 tx 和 rx,让 ...

  3. Mac下的串口通信-ORSSerialPort

    ================================2015/11/05======================================= 最近在工作中遇到有关Mac下串口通信 ...

  4. vxworks下网络编程一:网络字节序问题

    inet_addr("192.168.1.1");//返回网络字节序整型ip地址inet_ntoa(saddr);//将包含网络字节序整型ip地址的in_addr对象转换成本地ch ...

  5. linux下查看串口信息

    rs232串口通信接口:当通信距离较近时(<12m),可以使用电缆线直接连接,若距离较远,需附加调制解调器. 9个脚针的定义: CDC数据载波检测,RXD接收数据,TXD发送数据,DTR数据中断 ...

  6. MFC下对串口的操作以及定时器的调用

    最近研究了一下MFC下对串口的操作,测试了一下对设备的读写. 1.打开串口 GetDlgItem(IDC_BUTTON_OPEN)->EnableWindow(FALSE); m_hComm = ...

  7. VxWorks下USB驱动总结2

    3:USBD驱动详解 这一部分将要描述USBD(USB Host Driver)的典型应用.例如初始化,client注册,动态连接注册,设备配置,数据传输,同时还探讨了USBD内部设计的关键特性.这部 ...

  8. Vxworks下的SATA提速

    1.       ATA接口的三种数据传输方式 (1)PIO(Programmable Input-Output)传输,可以分为PIO寄存器传输和PIO数据传输.PIO寄存器传输主要用于对ATA设备中 ...

  9. vxWorks下dosFs文件系统的创建

    .cdromFs:允许系统从按照ISO9660标准文件系统格式化的CD-ROM上读取设备: 通常文件系统驱动位于磁盘(块存取)设备驱动和IO系统之间,这一点在VxWorks中也不例外,但它在此基础上扩 ...

随机推荐

  1. JAVA动态代理机制解析

    1. 概述 首先,我们来思考如下两个问题: 什么是代理模式?为什么要使用代理模式? 简单总结一下,所谓的代理模式就是在原有的服务上多加一个占位,通过这个占位去控制服务的访问.通过代理模式,一方面可以控 ...

  2. ansible playbook实践(二)-基础相关命令

    ansible相关的命令: ansible  用来执行ansible管理命令 ansible-doc 用来获取模块的帮助文档 ansible-playbook 当有众多任务时,可编写成playbook ...

  3. BZOJ 2055: 80人环游世界 [上下界费用流]

    2055: 80人环游世界 题意:n个点带权图,选出m条路径,每个点经过val[i]次,求最小花费 建图比较简单 s拆点限制流量m 一个点拆成两个,限制流量val[i],需要用上下界 图中有边的连边, ...

  4. Linux修改IP永久生效

    修改IP永久生效按以下方法: 1)修改配置文件vi /etc/sysconfig/network-scripts/ifcfg-eth0(eth0,第一块网卡,如果是第二块则为eth1) 按如下修改ip ...

  5. 深度学习(一。深度学习概览)(mooc视频https://www.icourse163.org/learn/MSRA-1002255002?tid=1002370003#/learn/content?type=detail&id=1003271123)

    一. 深度学习概览 1.为什么resnet应用在图像识别 因为传统神经网络精度有限,而只是增加层数无法提高精度.而resnet可以改变这个问题. 2.Microsoft SwitchBoard 在语音 ...

  6. 【非原创】C++类成员函数的重载、覆盖和隐藏

    链接:https://www.nowcoder.com/questionTerminal/266d3a6d4f1b436aabf1eff3156fed95来源:牛客网 题目:类成员函数的重载.覆盖和隐 ...

  7. Windows Server 2016-部署第一台域控制器

    上节我们提到有关WinSer 2016 Active Directory域服务概述.WinSer2016 AD域中新增的功能及先决条件等,本节就为大家带来WinSer2016下搭建部署第一台域控的操作 ...

  8. centos-安装python3.6环境并配置虚拟环境

    python3.6下载地址:https://www.python.org/ftp/python/3.6.4/Python-3.6.4.tgz linux下python环境配置 统一目录: 源码存放位置 ...

  9. tcp_sync_server and tcp_sync_client

    #include <iostream> #include <fstream> #include <sstream> #include <boost/asio. ...

  10. zookeeper 内部机制学习

    zookeeper 内部机制学习 1. zk的设计目标 最终一致性:client不论连接到那个Server,展示给它的都是同一个视图. 可靠性:具有简单.健壮.良好的性能.如果消息m被到一台服务器接收 ...