vxworks RS422串口接收大数据格式包丢包问题

问题描述:

VxWorks 5.5操作系统外挂16c752串口芯片,422接口接收中频板过来的数据,在测控台发现收发数据包数不一致,导致丢包发生。


验证:

1.通过网口对比,收发数据包正常,无丢包产生。

2.在测控台使用STD模式发送小包测试也无问题;

3.在测控台使用PS4模式发送大包测试发现有丢包(2000包丢12包)


解决方案:

1.16c752硬件支持fifo大小为64byte;当我们按照PS4模式(每包400byte)每隔50ms发送一次数据包,每秒的数据量为400*8*20=64000bit;而波特率设置为460800;即硬件FIFO不足以承受这么大的数据量,此时就会导致丢包问题产生;

2.在16c752的驱动中,在创建tty设备时,可以将软件的读写BUFFER放置的大一些,以此避免该问题的发生。ttycreate函数中;



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
着计算机在工业的广泛应用控制局域网络也深入应用到各行各业之中现行的诸多控 制系统若采用单机控制方式已越来越难以满足设备控制的要求因为往往我们所控制的设备 只是整个系统的一个基本单元它既需要外部输入一些必要的信息同时也需要向外部输出自 身的运行参数和状态所有这些都要求我们采用控制网络技术将众多设备有机地连成一体以 保证整个系统安全可靠地运行目前在我国应用的现场总线中RS-485/RS-422 使用最为 普遍当用户要将基于标准的RS-232 接口设备如PC 机连接至由RS-485/RS-422 构成 的通讯网络时则必须作RS-232和RS-485/RS-422之间的电平转换传统的做法是在设备 内扩展一个通讯适配卡由通讯适配卡实现电平转换内部主机再通过并行总线读出或写入数 据显然这种设计方法存在下列缺点 A.由于适配卡是基于某一种总线标准扩展的而不是基于RS-232电平标准所以其应用 范围受到限制只能一种适配卡适用一种总线如ISA 适配卡不可能插入STD总线或用户自 定义的总线其通用性较差 B.虽然实现的仅仅是电平转换但是由于需要考虑与扩展总线的接口和增加一个标准的 UART 并且需要占用系统的其它宝贵资源使硬件和软件变得过于复杂 C.复杂的硬件设计大大增加了元器件的数目和电路板面使适配卡的成本过高 D.由于采用内置插卡方式使变更通信方式比较麻烦如将半双工通信方式设置为全双工 方式等另外维修和测试也比较麻烦 E.对于现有的基于RS-232的设备在无法变动系统软件和硬件的情况下显然适配卡无 法将这些设备连成基于RS-485或RS-422通信网络的分布式系统为了克服上述缺点同时考虑到RS-232 接口的自身特点我们设计了一种小巧的无须外部供电的智能收发转换器实 现RS-232和RS-485/RS-422之间的电平转
VxWorks 操作系统中,可以使用 ioctl() 函数来进行串口配置和数据传输。下面是一个示例代码,用于在 VxWorks 中接收串口数据: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ioLib.h> #include <taskLib.h> #include <semLib.h> #include <sysLib.h> #include <tyLib.h> /* 串口设备名 */ #define SERIAL_DEV_NAME "/tyCo/1" /* 串口接收缓冲区大小 */ #define SERIAL_RX_BUF_SIZE 1024 /* 串口接收信号量 */ SEM_ID serialRxSem; /* 串口接收缓冲区 */ char serialRxBuf[SERIAL_RX_BUF_SIZE]; /* 串口接收任务 */ void serialRxTask(void) { int fd; int nBytes; int i; char c; /* 打开串口设备 */ fd = open(SERIAL_DEV_NAME, O_RDONLY, 0); if (fd == ERROR) { printf("Failed to open serial device %s!\n", SERIAL_DEV_NAME); return; } while (1) { /* 接收数据 */ nBytes = read(fd, &c, 1); if (nBytes == ERROR) { printf("Failed to read from serial device %s!\n", SERIAL_DEV_NAME); break; } else if (nBytes == 0) { printf("No data received from serial device %s!\n", SERIAL_DEV_NAME); break; } /* 将接收到的数据存入缓冲区 */ serialRxBuf[i++] = c; if (i >= SERIAL_RX_BUF_SIZE) { i = 0; } /* 发送接收信号量 */ semGive(serialRxSem); } /* 关闭串口设备 */ close(fd); } /* 主函数 */ int main(int argc, char* argv[]) { /* 创建串口接收信号量 */ serialRxSem = semBCreate(SEM_Q_PRIORITY, SEM_EMPTY); /* 创建串口接收任务 */ taskSpawn("serialRxTask", 100, 0, 4096, (FUNCPTR) serialRxTask, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); while (1) { /* 等待串口接收信号量 */ semTake(serialRxSem, WAIT_FOREVER); /* 处理接收到的数据 */ // TODO: Add your code here } return 0; } ``` 在上面的代码中,serialRxTask() 函数是一个用于接收串口数据的任务。在该函数中,我们首先打开指定的串口设备,然后不断地从串口中读取数据,并将其保存到串口接收缓冲区中。每当收到一个字符时,我们就向串口接收信号量发送一个信号,通知主函数有数据需要处理。在主函数中,我们不断等待串口接收信号量的到来,并处理接收到的数据。请注意,这只是一个示例代码,您需要根据具体的应用场景对其进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值