设为首页 收藏本站
查看: 1212|回复: 0

[经验分享] vxworks串口编程

[复制链接]

尚未签到

发表于 2017-6-23 07:12:33 | 显示全部楼层 |阅读模式
  在vxware下的vxworks学习串口编程
  1 开发主机,就是你的PC拉,要有com1,com2串口哦
2 在vmware下配置好基于x86 pcPentium的vxworks
3 一根串口直连线,这个应该好买的
实现步骤:
1 首先用串口直连线把你的com1和com2连接起来
2 其次,配置vmware的虚拟设备,添加Serial<->com1;Serial2<->com2
如下图所示:
DSC0000.jpg

  3 然后,在tornado下配置你的vxworks
默认的vxworks配置组件是包含INCLUDE_TTY_DEV的,所以这步当然不用管了
DSC0001.jpg

  4 在1的基础上,运行你的vxworks
启动后,在shell下devs可以看到/tyCo/0, tyCo/1两个串口设备
DSC0002.jpg

  这实际上是逻辑意义上的串口设备
恩,就这么简单,环境搭建好了 写个小程序测试一下吧 ^-^
#include <ioLib.h>
#include <stdio.h>
#include <taskLib.h>
#include <sioLib.h>
#include <string.h>
int tyRecv(int fd)
{
int readCnt1;
char rd;
char buff[512];
int i;
FOREVER
{
i=0;
taskDelay(50);
ioctl(fd,FIONREAD,(int) &readCnt1); /* 判断com2接收数据缓冲区是否有数据到来 */
if(readCnt1>0)
{
while(readCnt1>0)
{
read(fd,&rd,1);
readCnt1--;
buff[i++]=rd;
}
buff='/0';
printf("read '%s' from com2 whose data were sent by com1/n",buff);
}
}
}
int tySend(int fd)
{
int wrtCount;
char buff[]="I am god of war!"; /* 发送内容 */
wrtCount = write(fd,buff,strlen(buff));
printf("write %d bytes to com1/n",wrtCount); /* 写com1口,然后数据就会通过串口直连线发送到com2方了 */
}
int testMain()
{
int com1_Fd,com2_Fd;
com1_Fd = open("/tyCo/0",2,0) ; /* 打开串口0,即serial<->com1 */
com2_Fd = open("/tyCo/1",2,0); /* 打开串口1,即serial2<->com2 */
  /* 设置串口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);
  
/* 发起接受数据的任务 */
taskSpawn("recv",60,0,0x2000,(FUNCPTR)tyRecv,com2_Fd,0,0,0,0,0,0,0,0,0);
  /* 发起发送数据的任务*/
  taskSpawn("send",80,0,0x2000,(FUNCPTR)tySend,com1_Fd,0,0,0,0,0,0,0,0,0);
}
  
下载运行testMain
输出如下:
write 16 bytes to com1
read 'I am god of war!' from com2 whose data were sent by com1
证明通信成功了
  
最好说一下注意事项
1 即使vmware不配置serial,serial2,vxworks只要包含TTY组件,起来后,devs都是有/tyCo/x的
这就是说明了这个只是逻辑意义上的物理设备,真正要在vmware下通信,还是要配上PC机的物理串口
2 这个很关键,当时我就是没注意到这点,搞了半天也没用串口调式助手监测到数据
  /tyCo/0 是对应vmware的serial 的
/tyCo/1 是对应vmware的serial2 的
当时我无意间这样配置的
DSC0003.jpg

  即我把serial2 用物理串口com1,然后打开串口调试助手,打开com2 监听数据
然后我的程序这样,程序的思想是
1 写方面:打开/tyCo/0,写com1,然后串口调试助手监听com2
2 读方面:发起了收任务,等待com2 发来数据
#include <ioLib.h>
#include <stdio.h>
#include <taskLib.h>
#include <sioLib.h>
#include <string.h>
int tyRecv(int fd)
{
int readCnt1;
char rd;
char buff[512];
int i;
FOREVER
{
i=0;
taskDelay(50);
ioctl(fd,FIONREAD,(int) &readCnt1);
if(readCnt1>0)
{
while(readCnt1>0)
{
read(fd,&rd,1);
readCnt1--;
buff[i++]=rd;
}
buff='/0';
printf("read '%s' from com1 whose data were sent by com2/n",buff);
}
}
}
int testMain()
{
int fd,wrtCount;
char buff[]="I am god of war!";
fd = open("/tyCo/0",2,0) ;
/* 我打开了/tyCo/0 ,但前面说了,/tyCo/0是对应serial的,而我现在vmware只配了serial2 */
/* 所以程序运行没看到任何期待的结果,解决办法在后面 */
  /* set com1 hardware option */
if ( ERROR==ioctl(fd,FIOBAUDRATE,9600) )
{
printf("can not set BAUDRATE!/n") ;
return ERROR ;
}
if ( ERROR==ioctl(fd,SIO_HW_OPTS_SET,(CLOCAL|CREAD|CS8)&~(HUPCL|STOPB|PARENB)))
{
printf("can not set OPT!/n") ;
return ERROR ;
}
ioctl(fd,FIOFLUSH,0);
wrtCount = write(fd,buff,strlen(buff)); /*write to com1*/
printf("write %d bytes to com1/n",wrtCount);
  /* Start receiving task */
taskSpawn("recv",60,0,0x2000,(FUNCPTR)tyRecv,fd,0,0,0,0,0,0,0,0,0);
}
  然后运行程序,结果在串口调试助手的接收区怎么也收不到数据
在串口调试助手的发送区发数据,结果我的recv任务也是死活打印不出信息
后来把fd = open("/tyCo/0",2,0) ; 改成fd = open("/tyCo/1",2,0) ;
这样,就和vmware配置的serial2<->com1对应起来了
然后一切就都OK了
下面就是正常通信的截图了
串口调试助手com2的接收区受到了com1发来的'I am god of war!'
DSC0004.jpg

  而vxworks下的收任务也收到了串口调试助手com2的发送区发送来的数据了
DSC0005.jpg

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-387022-1-1.html 上篇帖子: 虚拟机下Ubuntu没有GUI图形界面,解决方法 下篇帖子: Vcenter server 5.5克隆模板(创建ISO镜像)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表