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

mcgs数据查表功能,用于大量数据对比查找对应数据,减少PLC代码

mcgs脚本实现数据查表功能

qq_24866535的博客 3270

在 NVIDIA Orin (JetPack 6.0) 上配置 PyTorch 2.4 + Torchvision 0.19 的完整避坑指南

本文提供在NVIDIA Jetson Orin设备上,基于JetPack 6.0系统配置PyTorch 2.4与Torchvision 0.19环境的完整指南。通过使用Miniconda环境隔离、安装特定版本PyTorch夜间构建版、编译匹配的Torchvision源码等步骤,解决版本不匹配、CUDA支持等常见问题,确保AI开发环境稳定可用。

weixin_29179311的博客 364

串口缓存大小设置

设置 串口 软 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

RK3588+TRL8367s四网口千兆交换机硬件调试与DTS配置实战

本文详细介绍了基于RK3588处理器与RTL8367S交换机芯片构建四网口千兆交换设备的硬件调试与DTS配置实战。文章深入对比了MDIO与SMI两种通讯方式的配置差异,提供了详尽的设备树代码示例,并总结了常见问题的排查思路,旨在帮助开发者高效完成嵌入式网络设备的软硬件集成与调试工作。

weixin_28308325的博客 468

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

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

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

大数据应用技术实验报告一 Hadoop三种模式安装配置

JDK+Hadoop安装配置、单机模式配置 以下操作在SecureCRT里面完成 1.关闭防火墙 firewall-cmd --state 显示防火墙状态running/not running systemctl stop firewalld 临时关闭防火墙,每次开机重新开启防火墙 systemctl disable firewalld 禁止防火墙服务。 2.传输JDK和HADOOP压缩包 Sec...

Ruthless_Childe的博客 3090

2024阅读AOSP源码的正确打开姿势

在Android系统开发中,阅读AOSP(Android Open Source Project)源码是非常重要的环节。然而,如何构建一个优雅的阅读环境却是一个不容忽视的问题。本文将介绍不同工具和方法下阅读AOSP源码的正确姿势,并对比其优缺点。

虎哥LoveDroid 2706

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

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

望星空 3688

用MATLAB计算卡方值

然后,我们计算了期望频数,即在两个分类变量独立的情况下,每个单元格的预期频数。接下来,我们使用卡方检验的公式计算了卡方值。卡方检验是一种常用的统计方法,用于确定两个分类变量之间是否存在相关性。它基于观察到的频数和期望频数之间的差异来评估分类变量之间的独立性。在MATLAB中,我们可以使用。请注意,这只是一个简单的示例代码,用于说明如何使用MATLAB计算卡方值。在实际应用中,您可能需要根据您的具体数据和研究问题进行相应的修改和调整。在上面的代码中,我们首先创建了两个分类变量。函数显示了计算得到的卡方值。

CodeNexus的博客 2658

vxworks常用API总结

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

爸爸帮你揉揉的博客 2702

华为OD机考双机位C卷 - 螺旋数字矩阵 (Java & Python& JS & C/C++ & GO )

华为OD机考双机位C卷 - 数字螺旋矩阵(OD上机考试双机位C卷)。提供在线OJ刷题。Java、C++、Python、GO语言、C语言、JavaScript题解,并提供完整思路讲解。

算法大师! 3217

FastAPI 高级特性:同异步路由函数、依赖注入与后台任务

在现代 Web 开发中,高效的性能和简洁的代码结构是至关重要的。FastAPI 作为一个现代、快速(高性能)的 Web 框架,凭借其对异步编程的原生支持和直观的依赖注入系统,迅速成为开发者的热门选择。在本文中,将深入探讨 `FastAPI` 中的几个核心概念:同异步函数的区别、`Depends` 依赖以及后台任务。

qq_43629857的博客 203

VxWorks编程常用函数说明

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

haobo920的专栏 4596

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

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

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

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

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

jiangkila的专栏 1963

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

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、付费专栏及课程。

余额充值