串口通讯编程示例之串口完整代码

news/2024/10/25 15:08:42/

注意:学习资料可在ElfBoard官方网站“资料”专区获取。

本节用到的源码路径:ELF 1开发板资料包->03-例程源码->03-1 命令行例程源码->02_elf1_cmd_serialport

serial.c

本节代码提供了串口通信的函数库,主要分三部分:

(一)设置串口参数'func_set_opt'

首先通过func_set_opt设置参数,波特率从600 bit/s-115200 bits/s,默认使用的是9600 bits/s;之后是校验位,五种校验方式分别为奇校验、偶校验、MARK校验、SPACE校验和空校验;另外还有检测是否有停止位;以及硬件连接方式是否带RTS和CTS引脚。

(二)发送数据'func_send_frame'

串口发送函数用于向串口发送数据。该函数接收一个文件描述符 fd,指向待发送数据缓冲区的指针 p_send_buff,以及要发送数据的长度 count。函数内部使用 write 函数将数据写入串口,并返回写入的字节数。

(三)串口接收'func_receive_frame'

串口接收函数用于从串口接受数据。该函数接收一个文件描述符 fd,指向接收数据缓冲区的指针 p_receive_buff,以及要接收数据的长度 count。函数内部使用 read 函数将数据从串口读出来,并返回实际读到的字节数。

serial.h

(一)定义串口参数结构体struct_tty_param,它包含以下成员变量:

baudrate:波特率,表示数据传输速率,取值范围为 600 到 4000000;

data_bit:数据位,表示每个数据字节中的位数,可取 5、6、7 或 8;

stop_bit:停止位,表示停止位的数量,可取 1 或 2;

check:校验方式,表示数据校验的方式。可以是 'N' 表示无校验,'O' 表示奇校验,'E' 表示偶校验;

hardware:硬件流控,表示是否启用硬件流控;

(二)声明func_set_opt

用于设置串口参数。它传入一个 fd,以及用于设置串口的参数值,包括速度 speed、数据位 bits、停止位 stop、校验方式 check 和硬件流控 hardware。函数返回执行结果。

(三)声明函数func_send_frame

用于向串口发送数据。它传入一个 fd,一个指向待发送数据缓冲区的指针 p_send_buff,以及要发送的数据长度 count。函数返回执行结果。

(四)声明函数func_receive_frame

用于从串口接收数据。它传入一个 fd,一个指向接收数据缓冲区的指针 p_receive_buff,以及最大接收数据长度 count。函数返回执行结果。

主函数main.c

(一)定义了一些全局变量,包括:

(1)`ver`:存储版本信息的字符数组;

(2)`fd`:串口文件描述符;

(3)`tty_param`:串口参数结构体,用于存储串口的波特率、数据位、停止位、校验方式和硬件流控等参数;

(4)`send_buff`、`receive_buff`:发送和接收数据的缓冲区;

(5)`send_num`、`receive_num`:发送和接收的数据长度;

(6)`dev`:串口设备名称;

(二)`func_my_print`:自定义的打印函数,根据指定的打印格式打印数据。

(三)`print_usage`:打印参数设置的格式说明。

(四)`get_param`:解析命令行参数,并将参数值赋给串口参数结构体 `tty_param`。

(五)`main` 函数:主函数,用于执行串口通信的示例程序。

(1)首先检查命令行参数,如果没有指定串口设备名称或使用了帮助参数,则打印使用说明并退出程序。

(2)通过命令行参数拼接串口设备名称,并打开串口设备。

(3)调用 `get_param` 函数解析命令行参数,并将参数值赋给 `tty_param`。

(4)调用 `func_set_opt` 函数设置串口参数。

(5)打印串口参数信息。

(6)进入循环,不断发送和接收数据,根据不同的模式选择不同的操作。

(7)如果启用了发送模式,则按照设定的时间间隔发送指定的数据。

(8)如果启用了数据回环模式,则将接收到的数据发送回去。

(9)关闭串口。

该程序通过命令行参数来设置串口的参数,并提供了发送和接收数据的功能。在主函数的循环中,可以根据需要选择不同的操作模式,例如定时发送数据、数据回环等。

程序说明

进程名:elf1_cmd_serialport

使用方法:./elf1_cmd_serialport 设备名 [参数选项]… …


http://www.ppmy.cn/news/1541853.html

相关文章

基于NVIDIA NIM平台—生成属于自己的DIY食谱

目录 一、介绍NVIDIA NIM平台 二、生成DIY食谱Demo 三、小结 一、介绍NVIDIA NIM平台 NVIDIA NIM(Nvidia Inference Microservices)平台是NVIDIA推出的一个微服务套件,旨在加速生成式AI模型在云端、数据中心和工作站上的部署和使用。以下是…

证明在由特定矩阵生成的幺半子群中,存在收敛序列的子序列,其元素也能分别构成收敛序列

设 H H H是 G L 4 ( R ) GL_4(\mathbb{R}) GL4​(R)的由矩阵 ( 1 a 0 0 0 1 0 0 0 0 1 0 0 0 0 1 ) , ( 1 0 0 0 0 1 b 0 0 0 1 0 0 0 0 1 ) , ( 1 0 0 0 0 1 0 0 0 0 1 c 0 0 0 1 ) \begin{pmatrix}1&a&0&0\\ 0&1&0&0\\ 0&0&1&0\\ 0&…

【纯血鸿蒙】安装hdc工具

这里我先写Mac版的,Windows的在下面 首先要知道你的SDK安装在哪里了,不知道的话,可以打开DevEco Studio,打开设置页面里的HarmonyOS SDK,这个我们之前配置环境变量的时候用过。 其实主要是用到这里toolchains下的hdc命令。 所以我们需要配置环境变量。 1、打开Mac下的…

ElasticSearch全文检索和倒排索引

本文内容参考了田雪松老师编著的《Elastic Stack应用宝典》 全文检索 先来解释一下什么叫全文检索。数据检索的目的是从一系列数据中,根据某一或某些数据特征将特定的数据找出来。从数据检索的角度来看,数据大体上可以分为两种类型:一种是结…

Java基础第一天(实训学习整理资料(一))

目录 一、Typora--markdown编辑器 二、dos常用指令 操作系统 相关的dos指令 三、Java语言简介 发展历史 版本变迁 3、java的技术结构 4、java的跨平台特性 四、Java的下载和安装 1、下载地址 2、文件说明 3、安装 五、第一个Java程序HelloWorld 六、Java保留字&a…

命名空间std, using namespace std

命名空间std&#xff0c;using namespace std 在标准C以前&#xff0c;都是用#include<iostream.h>这样的写法的&#xff0c;因为要包含进来的头文件名就是iostream.h。标准C引入了名字空间的概念&#xff0c;并把iostream等标准库中的东东封装到了std名字空间中&#x…

【前端】JQ读取本地txt文本内容,并显示到页面上

目录 需求&#xff1a; 效果图 示例代码 需求&#xff1a; 有一个本地txt文件&#xff0c;把txt文件的内容按照原格式显示到页面上。 有两种解决方案&#xff0c;但是只支持UTF8编码的txt文件&#xff0c;如果是其他编码请转换成UTF8&#xff0c;这里有一个批量转换工具可以…

基于HEVC视频流选择加密的安全性研究

随着视频应用需求的持续增长&#xff0c;确保其安全性显得尤为重要。选择加密&#xff08;SE&#xff09;因其与视频编码器的良好兼容性、出色的视觉失真效果和低时间复杂度而在视频内容保护领域备受关注。然而&#xff0c;针对HEVC视频流选择加密的安全性研究尚处于起步阶段。…