VxWorks 串口读写操作

vxWorks调试记录 本文章不定时更新,主要记录在学习vxWorks系统中遇到的问题以及解决途径,适用于ZYNQ7K芯片。 阅读详情
AI摘要

本文介绍在VxWorks环境下如何配置和使用串口,包括打开串口、设置波特率、数据位等参数的方法,并提供了一个串口读写的实例代码。

在 VxWorks 中,系统内核已经帮我们实现了串口驱动,所以可以用统一的接口函数和命令来配置串口相关参数,这一点相比 Linux 简单得多。

串口配置过程

打开串口

fd = open("/tyCo/0", O_RDWR, 0);
"/tyCo/0" 串口1的设备名,O_RDWR:open for reading and writing

设置串口raw模式,清空输入输出的缓冲区

在VxWorks中配置串口可以直接通过ioctl的控制命令来实现,
ioctl(fd,FIOSETOPTIONS,OPT_RAW);
ioctl(fd,FIOFLUSH,0);
ioctl(int fd,int function,int arg);
function的参数如下:

FIOBAUDRATE设置波特率,arg为一整数,表示要设定的波特率
FIOGETOPTIONS取得设备控制字,arg表示读出的内容存放的位置
FIOSETOPTIONS设置设备控制字,arg表示要设置的选项
FIOGETNAME取得文件描述符对应的文件名,arg存放文件名的缓冲区
FIOREAD取得输入缓冲区内未读取的字符数,arg用于接收结果的整型指针
FIOWRITE取得输出缓冲区内的字符个数,arg用于接收结果的整型指针
FIOFLUSH清空输入输出缓冲区的字符
FIOCANCEL取消读和写

设置波特率,数据位,停止位,校验方式

在 VxWorks 中设置串口也是用 ioctl 系统调用加控制命令实现,其控制命令为SIO_HW_OPTS_SET,第三个参数跟配置参数,如:数据位为8,停止位为1,无奇偶校验位,无流控可以这样配置

  ioctl(fd,SIO_HW_OPTS_SET,CS8|PARENB|CLOCAL|CREAD);

具体各项参数意义如下:

CLOCAL忽略modem控制信号
CREAD启动接收器
CSIZE指定数据位:CS5~CS8
HUPCL最后关闭时挂断modem连接
STOP8被设置时指定2位停止位,否则默认为1位停止位
PARENB被设置时启用奇偶校验,否则默认为无奇偶校验
PARODD被设置时启用奇校验,否则默认为偶校验(PARENB设置时才有效)

串口读写操作

在VxWorks中串口的读写操作非常简单,直接使用系统调用 read ()和write()就能实现串口的读写操作。
int read(int fd, char *buffer, size_t maxbytes )
参数说明:

  • fd:用open函数打开串口设备返回的文件描述符;
  • buffer:读取的内容将要存放的地址,为指针变量;
  • maxbytes:读取的最大字节数

int write(int fd, char *buffer, size_t nbytes)
参数说明:

  • fd:用open函数打开串口设备返回的文件描述符;
  • buffer:将要写的内容的地址,为指针变量。通常为字符串首地址;
  • nbytes: 将要写入的字节数,通常为要写入的字符串的长度。

实例

来贴上一个基于 VxWorks 的串口实例

#include "vxWorks.h"
#include "stdio.h"
#include "ioLib.h"
#include "taskLib.h"
#include "sioLib.h"
#include "sdLib.h"
#include "semLib.h"
#include "msgQLib.h"

char wbuf[] = "hello";

#define DEV_NAME "/tyCo/2"
#define MAX_BUF_SIZE    20
#define SD_COMMDATA_NAME    "share_data"
#define SD_COMMDATA_MUTEX   "share_sem"
#define SHARE_DATA_LENGTH 20

typedef struct unix_clock_struct 
{
    UINT32      sec;            /* ms */    
    UINT32      msec;       /* s */
    UINT8       quality;    /* 时标质量 */
} UNIX_CLOCK_STRUCT;

char *comdata;
int set_serial(int fd);
SEM_ID mutexComdata;

void taskUart(void);
int main(void)
{
    int ret;
    int sdCommId;
    char r_buff[MAX_BUF_SIZE];


    mutexComdata = semOpen(SD_COMMDATA_MUTEX, SEM_TYPE_MUTEX, SEM_FULL, SEM_Q_PRIORITY | SEM_DELETE_SAFE | \
                SEM_INVERSION_SAFE, OM_CREATE | OM_DELETE_ON_LAST_CLOSE, NULL);
    if(mutexComdata == NULL)
    {
        /*致命错误,无法创建互斥锁*/
        printf("ERROR TO OPEN SD_COMMDATA_MUTEX\n");
        taskExit(0);
    }   

    /* 申请公共数据共享内存  */
    sdCommId = sdOpen(SD_COMMDATA_NAME, SD_LINGER, OM_CREATE, SHARE_DATA_LENGTH, 0, SD_ATTR_RW|SD_CACHE_OFF, &comdata);
    if(sdCommId == NULL)    
    {
        /*致命错误,无法分配公共数据内存,报错退出*/
        printf("ERROR TO OPEN SD_COMMDATA\n");
        taskExit(0);
    }   

    if((ret = taskSpawn("taskUart",90,0x100, 20000, (FUNCPTR)taskUart,\
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0)) < 0)
    {
        printf("taskSpawn failed:ret = %s\n");
    }

    //return 0;
}

void taskUart(void)
{
    int ret;
    int fd = -1;
    UNIX_CLOCK_STRUCT w_buff;

    if((fd = open(DEV_NAME, O_RDWR,0)) < 0)
    {
        printf("open %s failed.\n",DEV_NAME);
    }


    /*配置串口参数*/
    if((ret = set_serial(fd)) < 0)
    {
        printf("ret = %d\nset_serial failed.\n");
    }

    while(1)
    {
        semRTake(mutexComdata,WAIT_FOREVER);
#if 0
        /*清空输入输出缓冲*/
        if((ret = ioctl(fd, FIOFLUSH, 0))<0)
        {
            printf(" ret = %d\nset FIOFLUSH failed.\n",ret);
        }


        memset(r_buff,0,sizeof(r_buff));
        /*读取串口中的值*/
        if((ret = read(fd,r_buff,sizeof(r_buff)))<0)
        {
            printf("ret = %d:read %s failed.\n",ret,DEV_NAME);
        }
        else
            printf("Received:%s\n",r_buff);
#endif  

#if 1
        /*清空输入输出缓冲*/
        if((ret = ioctl(fd, FIOFLUSH, 0))<0)
        {
            printf(" ret = %d\nset FIOFLUSH failed.\n",ret);
        }

        if(NULL == bzero(&w_buff,sizeof(w_buff)))
        {
            printf("memset failed.\n");
        }

        if(NULL == memcpy(&w_buff,comdata,sizeof(w_buff)))
        {
            printf("memset failed.\n");
        }

        if(&w_buff != NULL)
        {
            /*往串口中写值*/
            if((ret = write(fd, &w_buff.sec, sizeof(ret)))<0)
           // if((ret = write(fd, wbuf, sizeof(wbuf)))<0)
            {
                printf("ret = %d:write %s failed.\n",ret,DEV_NAME);
            }
            else
            {
                printf("write success:%d\n",w_buff.sec);
            }
        }

        semGive(mutexComdata);
#endif
        taskDelay(sysClkRateGet()*2);
   }
}

int set_serial(int fd)
{
    int error = -1;
    int ok = 0;
    int ret;

    if(fd<0)
    {
        printf("error:fd is %d\n",fd);
    }
    /*设定波特率为9600*/
    if((ret = ioctl(fd, FIOBAUDRATE, 9600))<0)
    {
        printf("ret = %d\n set baudrate failed\n",ret);
        return error;
    }

    /*设定:数据位为8,无奇偶校验,1位停止位*/
    /*CLOCAL:忽略modem控制信号
     * CREAD:启动接收器
     * CS8:设定数据位为8*/
    if((ret = ioctl(fd, SIO_HW_OPTS_SET,CREAD|CS8 |CLOCAL))<0)
    {
        printf("ret = %d\nset SIO_HW_OPTS_SET failed.\n");
        return error;
    }

    return ok;
}
vxworks下的串口测试程序 /* *vxworks 串口测试 * * zjx at evoc 2007.5.17 *pippo add rs485 串口测试at evoc 2007,12,21* *pippo add 文件系统测试at evoc 2007,12,21* *使用方法: *  1. comrecv  ttynum,rate    (ttynum表示接收串口号,rate表示波特率) *  2. 阅读详情

相关推荐

VxWorks系统下龙芯平台的PCI驱动与硬件配置

在VxWorks操作系统中,PCI(外围组件互连)总线的支持对于嵌入式系统至关重要。本文档将详细解释龙芯(Loongson)平台上VxWorks系统的PCI驱动架构,重点分析g64120aPci.c驱动文件和hwconf.c硬件配置文件的作用及其相互关系。/* 添加新的PCI设备资源 *//* 注册到设备列表 */// ... 其他设备VxWorks系统在龙芯平台上的PCI支持通过g64120aPci.c驱动和hwconf.c配置文件的紧密配合实现。

weixin_45397344的博客 654

vxworks串口的初始化和读写

vxworks串口的初始化,简单说明

1万+

VxWorks环境下串口通信开发全攻略

VxWorks 是由Wind River公司开发的一套实时操作系统(RTOS),广泛应用于嵌入式系统和关键任务处理领域。本章节将对VxWorks的基本特点、架构和实时性进行概述。通用串行驱动(General Serial Driver,GSLB)是为各种串行通信设备设计的驱动程序,旨在提供一套标准化的接口,以简化设备制造商和软件开发者之间的接口差异。GSLB特别适合于需要跨平台支持或者希望实现快速移植的场景,例如工业控制、嵌入式系统和多样的外围设备接口。

weixin_36184718的博客 1274

在vxware下的vxworks学习串口编程

【主题】在vxware下的vxworks学习串口编程对于没有真实环境的朋友在虚拟机下安装vxworks学习她是不二之选了那在学习驱动方面,又从什么入门好呢?面对最为普遍的串口,从串口驱动入门,了解vxworks的IO系统、设备驱动开发等等,也是满好的方式吧没有目标机的朋友,怎么学习串口呢,其实很简单,本文就是做个引子,说说虚拟机下的vxworks串口编程的环境建立学习条件:1 开发主机,就是你的P

tearring的专栏 9274

vxworks调试方法总结与shell命令

文档较为详细的记录了vxworks操作系统的shell下的调试方法,结合实际情况给出了分析,并且列出了常用的较为关键的shell命令,对于实际工程的开发非常有帮助

VxWorks串口编程代码

VxWorks串口编程代码:包括串口的配置,读写操作,以及任务量的启动。

VxWorks串口初始化读写

VxWorks串口初始化读写 VxWorks串口设置一般分以下几步 打开串口 设置串口raw模式,清空输入输出缓冲区 设置波特率、数据位、停止位、校验方式 开始读写 1. 打开串口 fd = open("/tyCo/0", O_RDWR, 0) “/tyCo/0” 串口1的设备名,O_RDWR:open for reading and writing 2. 设置串口raw模式,清空输入输出的缓冲区 使用函数’ioctl(int fd, int function, int arg)'这个函数 f

qq_44698084的博客 2094

VxWorks下串口通信示例程序

该程序是基于vxworks嵌入式操作系统下的关于串口通信的程序实例。包含全部的源代码。

VxWorks6.8串口示例

VxWorks6.8串口案例VxWorks6.8串口示例串口简介VxWorks串口所需要包含的头文件VxWorks串口配置函数open函数write函数read函数Seri_Demo_Qt_VxTestSeri_Demo_Qt_Vx_Demo232串口接线说明 VxWorks6.8串口示例 大家好我是背锅侠“IT幻想家”,今天跟大家简单分享下VxWorks下一个项目的小模块结合Qt实现的(Vx6....

weixin_43519792的博客 3180

腾讯云智后台开发实习面试全纪录(已offer)

腾讯云智后台开发实习面经

wenwenaier的博客 5903

告别版本过低提示!微信3.9登录修复与聊天记录无缝迁移全攻略

本文详细解析了微信3.9版本过低提示的根源,并提供了完整的修复方案和聊天记录迁移指南。通过专用修复工具绕过版本检测,以及新旧版本聊天记录目录对比,帮助用户实现无缝迁移。特别提醒备份重要数据,确保操作安全。

weixin_42535461的博客 3141

串口缓存大小设置

设置 串口 软 fifo int UartBuffSizeSet(char dev_path,int size) { int ret; int fd = open(dev_path, O_RDWR | O_NOCTTY | O_NONBLOCK); if(fd < 0){ return -1; } struct serial_struct serial; ret = ioctl(fd, TIOCGSERIAL, &serial); if (ret != 0) { close(fd); re.

huangling07031190的专栏 4492

用STM32F103C8T6和TB6612驱动模块,从零搭建一辆能避障循迹的智能小车(附完整代码)

本文详细介绍了如何使用STM32F103C8T6和TB6612驱动模块从零搭建一辆能避障循迹的智能小车。内容涵盖硬件选型、电路设计、底层驱动配置以及智能行为算法实现,并附有完整代码示例,帮助开发者快速掌握嵌入式开发的核心技术。

weixin_42641741的博客 444

VxWorks开发板驱动程序学习之内部UART0

UART of S3C2410A UART0 驱动代码学习 VxWorks API ioctl write taskSpawn ioctl write taskSpawn 今天来学习一个简单的驱动——S3C2410内部的UART0即串口0驱动程序。 其实移植一个系统(VxWorks),最重要也是最开始的第一步就是把串口驱动调试好了,然后利用串口连接开发板和上位机开发环

对酒当歌,人生几何。譬如朝露,去日苦多 1742

基于Claude AI的Dex个人操作系统:从零部署到高效工作流实战

在当今信息过载的时代,个人知识管理(PKM)和任务自动化成为提升效率的关键技术。传统PKM工具如Notion、Obsidian虽然提供了强大的信息存储能力,但本质上是被动的数据库,需要用户手动维护结构和链接,容易形成信息孤岛。其核心原理在于通过预设的文件夹结构和智能路由,实现信息的自动归类与关联。这种自动化同步机制的技术价值在于彻底消除重复劳动和决策疲劳,让用户从繁琐的信息整理中解放出来,专注于高价值思考。在实际应用场景中,它尤其适合需要处理大量会议、任务和人际关系的知识工作者,如产品经理、项目经理和团队领

weixin_42521558的博客 377

App渗透 - 人脸识别登录绕过

一、APP抓包和逆向破解加密算法打开APP是一个登录框抓包后发现参数被加密了使用Jadx脱源码发现,并没有加壳也没有混淆,运气很好根据经验,先搜索Encrypt、Decrypt等关键字,发现在Common.js中有一个encryptData函数定位过去,一套加解密算法都写好了放在这放到浏览器console里面调试,果然没错二、寻找注入点首先测试了一下注入明文:{"userName":"TEST'...

渗透测试研究中心 2823

VxWorks 环境下串口驱动程序设计

1  引 言对于一个集管理、决策、控制及各种信息融合为一体的大系统来说,操作系统起着极其重要的作用。近年来,国内对嵌入式操作系统的研究已开始成为热点,但就大多数应用来看,还处在较为简单的发展阶段,严重地制约各种新理论、新算法的实现,而且系统鲁棒性无法有质的提高。作为一个优秀的操作系统,VxWorks 实现了比其他实时操作系统更好的有效性、商用性、可裁减性以及互操作性[ 1 ] ,广泛应用在通信、军

望星空 3688

VMware Ubuntu虚拟机突然断网?我用5步彻底解决了(附避坑指南)

Ubuntu虚拟机断网问题通常由网络配置冲突和VMware服务未正确绑定导致。本文提供5步解决方案:1)清理Ubuntu重复有线连接;2)重启Windows主机的VMware服务;3)检查VMware虚拟网络配置;4)重新配置Ubuntu网络参数;5)测试网络连通性。关键避坑点包括:避免多连接共存、修改配置后必重启服务、确保虚拟网卡绑定主机。通过"网卡状态→IP/路由→网关→服务"的排查思路,可快速解决虚拟机网络故障。文末附有详细的故障症状对照表,便于快速定位问题。

m0_58530495的博客 626

vxworks常用API总结

这两天在看VxWorks下的socket网络方面的编程,其中涉及到不少VxWorks下的函数使用,在网上搜了半天觉得这个很不错,于是将其copy下来。最后给出了copy的链接。 vxWorks编程指南   一、官方的Program Guide 位于安装目录下:\docs\vxworks\guide\index.html 二、常用的库: #i nclude "ta

爸爸帮你揉揉的博客 2702

论文阅读: SIGIR 2025 ID-Free Not Risk-Free: LLM-Powered Agents Unveil Risks in ID-Free Recommender Syste

咱们平时用的推荐系统(比如购物APP推商品、视频APP推剧),大多是“有ID”的——每个用户、每个商品都有个专属ID,系统靠这些ID记录你的浏览、购买历史,再给你推喜欢的东西。但这种方式有个大问题:新用户、新商品刚上线时没有ID历史数据,系统没法精准推荐,这就是“冷启动”难题。后来人们搞出了“无ID推荐系统”:不用ID了,改成直接分析商品的文字信息(比如商品标题、描述),靠大语言模型(LLM,类似ChatGPT的技术)把文字转成“语义代码”,再通过这些“代码”判断你可能喜欢什么。

CSPhD-winston的博客 977

肖特基二极管选型参数,结构原理,工艺与注意问题总结

肖特基二极管(Schottky Diode)是一种特殊的二极管,也被称为肖特基势垒二极管。它是利用金属与半导体接触形成的金属-半导体结原理制成的。与传统的PN结二极管相比,肖特基二极管具有更低的正向压降、更高的开关速度、更高的反向恢复时间以及更好的温度稳定性等特点。本文对肖特基二极管的工作原理,结构特点,工艺流程,选型参数及设计注意事项进行总结。

fydar的博客 812

VxWorks编程常用函数说明

VxWorks编程常用函数说明 一、官方的Program Guide 位于安装目录下:\docs\vxworks\guide\index.html 二、常用的库: #include "taskLib.h" /* 任务 */ #include "msgQLib.h" /* 消息队列 */ #include "semLib.h" /* 信号量 */ #include "io

haobo920的专栏 4596

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

VxWorks常用函数速查

一、官方的Program Guide  位于安装目录下:\docs\vxworks\guide\index.html   二、常用的库:  #i nclude "taskLib.h" /* 任务 */ #i nclude "msgQLib.h" /* 消息队列 */ #i nclude "semLib.h" /* 信号量 */ #i nclude "ioLib.h" /* IO */ #i

tyutzxp1的专栏 1926

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

【转帖】VxWorks编程常用函数说明

 VxWorks编程常用函数说明 一、官方的Program Guide位于安装目录下:/docs/vxworks/guide/index.html  二、常用的库:#include "taskLib.h" /* 任务 */ #include "msgQLib.h" /* 消息队列 */ #include "semLib.h" /* 信号量 */ #inclu

jiangkila的专栏 1963

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

vxworks 函数速查

一、官方的Program Guide 位于安装目录下:\docs\vxworks\guide\index.html 二、常用的库: #include "taskLib.h" /* 任务 */  #include "msgQLib.h" /* 消息队列 */  #include "semLib.h" /* 信号量 */  #include "ioLib.h" /* IO */

yiyanwannian328的专栏 1197

vxWorks函数速查手册

一、官方的Program Guide 位于安装目录下:\docs\vxworks\guide\index.html 二、常用的库: #include "taskLib.h" /* 任务 */  #include "msgQLib.h" /* 消息队列 */  #include "semLib.h" /* 信号量 */  #include "ioLib.h" /* IO */

固本培元的专栏 5088
上一篇: C语言基础知识学习记录
下一篇: 基于VxWorks的VxBus字符设备驱动
Escropion
博客等级 码龄11年 145粉丝 52原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值