X86平台下用VxWorks编程控制串口,跟硬件最相关的就是对串口的读写操作。自己编了一个小的读写程序,在机器上跑不通。具体表现为:写操作无效(另一方用串口调试助手收不到数据),但是write()返回值正常,也能看到VmWare上的串口设备有闪动;读操作是无限循环的,只要有数据就读入并显示,然后再写回串口去,自然是一点东西没写出去,而且也只能读到一定量的数据,之后另一方再怎么发都不再接收,但是在另一方关机时收到了那些之前没显示的数据。
两边用串口调试助手试过了,收发均正常,问题应该是出在软件上。把程序贴出来,希望能找到一点思路。
- C/C++ code
#include "vxworks.h"#include "sysLib.h"#include "tyLib.h"#include "ioLib.h"#include "stdio.h"#include "ioctl.h"#include "string.h"void test(){ int fd; int i; /* 计数器 */ int readcnt; /* 待读取字节数 */ int wtcnt; /* write()返回值 */ char buff[100]; /* 输入缓冲 */ struct fd_set readfd; /* 串口设备置位 */ struct fd_set savefd; /* 重置变量 */ char dt[] = "\nhello!"; /* 要输出的数据 */ fd = open("/tyCo/0",O_RDWR,0); ioctl(fd,FIOSETOPTIONS,OPT_RAW); ioctl(fd,FIOBAUDRATE,9600); ioctl(fd,SIO_HW_OPTS_SET,CS8); /* 8数据位,1停止位,无校验 */ ioctl(fd,FIOFLUSH,0); FD_ZERO(&readfd); FD_SET(fd,&readfd); savefd = readfd; wtcnt = write(fd,dt,strlen(dt)); /* 输出 */ printf("\nWrite ok. number = %d",wtcnt); bzero(buff,100); while(1) { readfd = savefd; select(fd+1,&readfd,NULL,NULL,NULL); /* Select()始终阻塞于串口 */ ioctl(fd,FIONREAD,&readcnt); if(readcnt > 0) { read(fd,buff,100); printf("\nRead: %s ",buff); write(fd,buff,100); } } }
------解决方案--------------------------------------------------------
你的程序在我的ARM11平台是好的,我有两个串口,uart1做console, uart0跑这个测试程序
现象是
vxWorks起来后,在console输入test,开始测试,uart0可以收到hello,然后在uart0,每输入一个字符1,console就会打印 read: 1。