6740|8

66

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

VxWorks+VmWare下使用串口的问题 [复制链接]

   X86平台下用VxWorks编程控制串口,跟硬件最相关的就是对串口的读写操作。自己编了一个小的读写程序,在机器上跑不通。具体表现为:写操作无效(另一方用串口调试助手收不到数据),但是write()返回值正常,也能看到VmWare上的串口设备有闪动;读操作是无限循环的,只要有数据就读入并显示,然后再写回串口去,自然是一点东西没写出去,而且也只能读到一定量的数据,之后另一方再怎么发都不再接收,但是在另一方关机时收到了那些之前没显示的数据。
  两边用串口调试助手试过了,收发均正常,问题应该是出在软件上。把程序贴出来,希望能找到一点思路。

  1. #include "vxworks.h"
  2. #include "sysLib.h"
  3. #include "tyLib.h"
  4. #include "ioLib.h"
  5. #include "stdio.h"
  6. #include "ioctl.h"
  7. #include "string.h"

  8. void test()
  9. {
  10.         int fd;
  11.         int i; /* 计数器 */
  12.         int readcnt; /* 待读取字节数 */
  13.         int wtcnt; /* write()返回值 */
  14.         char buff[100]; /* 输入缓冲 */
  15.         struct fd_set readfd; /* 串口设备置位 */
  16.         struct fd_set savefd; /* 重置变量 */
  17.         char dt[] = "\nhello!"; /* 要输出的数据 */

  18.         fd = open("/tyCo/0",O_RDWR,0);
  19.         ioctl(fd,FIOSETOPTIONS,OPT_RAW);
  20.         ioctl(fd,FIOBAUDRATE,9600);
  21.         ioctl(fd,SIO_HW_OPTS_SET,CS8); /* 8数据位,1停止位,无校验 */
  22.         ioctl(fd,FIOFLUSH,0);

  23.         FD_ZERO(&readfd);
  24.         FD_SET(fd,&readfd);
  25.         savefd = readfd;

  26.         wtcnt = write(fd,dt,strlen(dt)); /* 输出 */
  27.         printf("\nWrite ok. number = %d",wtcnt);
  28.         bzero(buff,100);
  29.         while(1)
  30.         {
  31.                 readfd = savefd;
  32.                 select(fd+1,&readfd,NULL,NULL,NULL); /* Select()始终阻塞于串口 */
  33.                 ioctl(fd,FIONREAD,&readcnt);
  34.                 if(readcnt > 0)
  35.                 {
  36.                         read(fd,buff,100);
  37.                         printf("\nRead: %s ",buff);
  38.                         write(fd,buff,100);
  39.                 }
  40.         }       
  41. }
复制代码

最新回复

学习 关注。。。。。  详情 回复 发表于 2011-10-31 13:07
点赞 关注
 

回复
举报

74

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
MARK
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
引用 1 楼 heaven_redsky 的回复:
MARK

大侠这次有什么建议不?
在另外一个论坛上有人建议把设置数据格式的那一行去掉,说驱动是8250的,硬件可能不是8250还带FIFO。
我不明白的是,如果不加那一行,数据如何识别,默认就是8N1?另外,串口带FIFO的影响到底有多大,如果去掉FIFO,那么读写就都是实时的了?是否万一读取不及时就读不到了?
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

4
 
mark就是标记一下。以后再看。
是在不好意思,我开发的时候都没有在VMware的环境下做过vxWorks,无法给出好建议。
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

5
 
最新进展,把write()用sysOutByte()替换,逐字节写,这样应该绕开驱动直接操作硬件了。测试结果是可以正常写串口,另一端也能收到数据。
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

6
 
你的程序在我的ARM11平台是好的,我有两个串口,uart1做console, uart0跑这个测试程序
现象是
vxWorks起来后,在console输入test,开始测试,uart0可以收到hello,然后在uart0,每输入一个字符1,console就会打印 read: 1。
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

7
 
引用 5 楼 lerd_cs 的回复:
你的程序在我的ARM11平台是好的,我有两个串口,uart1做console, uart0跑这个测试程序
现象是
vxWorks起来后,在console输入test,开始测试,uart0可以收到hello,然后在uart0,每输入一个字符1,console就会打印 read: 1。

谢谢,这样就肯定我的程序是没有问题的,看来问题还是在驱动上。
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

8
 
请教下,如何使用sysOutByte()替换write()
 
 
 

回复

16

帖子

0

TA的资源

一粒金砂(中级)

9
 
学习
关注。。。。。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表