Linux串口应用编程-RZMPU工业控制教程连载(6)

瑞萨MCU小百科 2024-09-02 12:15

第4章 Linux串口应用编程

参考资料(您可识别下方二维码或复制链接至浏览器中打开查看)

Serial Programming Guide

for POSIX Operating Systems

https://digilander.libero.it/robang/rubrica/serial.htm


Linux串口编程

https://www.cnblogs.com/feisky/archive/2010/05/21/1740893.html


Linux串口—struct termios结构体

https://blog.csdn.net/yemingzhu163/article/details/5897156


4.1 串口API

图4.1 Linux串口通信


在Linux系统中,操作设备的统一接口就是:open/ioctl/read/write。对于UART,又在ioctl之上封装了很多函数,主要是用来设置行规程。所以对于UART,编程的套路就是:


⚫ open;

⚫ 设置行规程,比如波特率、数据位、停止位、检验位、RAW模式、一有数据就返回;

⚫ read/write

怎么设置行规程?行规程的参数用结构体termios来表示,可以参考Linux串口—struct termios结构体。


您可识别下方二维码或复制链接至浏览器中打开查看:

Linux串口—struct termios结构体

https://blog.csdn.net/yemingzhu163/article/details/5897156



这些函数在名称上有一些惯例:

▪ tc:terminal contorl

▪ cf:control flag

下面列出一些函数:

表4-1 行规程函数


函数不多,主要是需要设置好termios中的参数,这些参数很复杂,可以参考Linux串口—struct termios结构体。


4.2 普通串应用编程(收发实验)

本实验通过把串口的发送、接收引脚短接,实现自发自收:使用write函数发出字符,使用read函数读取字符。


源码位于如下目录:


4.2.1 硬件连接

打开瑞米派原理图“myb-yg2lx-remi-v10-1226.pdf”,把下图的UART_TX、UART_RX短接:


板子上的操作如下图所示:


4.2.2 程序分析

1. 程序主流程分析

当我们执行“./serial_send_recv/dev/ttySC4”命令时,main 函数会首先打开串口、设置串口参数,代码如下:

左右滑动查看完整内容

/* * ./serial_send_recv  */ int main(int argc, char **argv){ int fd; int iRet; char c;
/* 1. open */
/* 2. setup* 115200,8N1 * RAW mode * return data immediately*/
/* 3. write and read */
if (argc != 2) { printf("Usage: \n");printf("%s \n", argv[0]); return -1; }
fd = open_port(argv[1]); if (fd < 0) {printf("open %s err!\n", argv[1]);return -1; }
iRet = set_opt(fd, 115200, 8, 'N', 1); if (iRet) { printf("set port err!\n"); return -1; }


第27行:打开串口(open_port函数后面再分析)。

第34行:设置串口参数(set_opt函数后面再分析)。


然后就可以往串口里发送数据、从串口读取数据了,代码如下:

printf("Enter a char: ");while (1) {scanf("%c", &c); iRet = write(fd, &c, 1);iRet = read(fd, &c, 1); if (iRet == 1)printf("get: %02x %c\n", c, c); elseprintf("can not get data\n");}


第4行:从控制台读取1个字符。

第5行:把这个字符写入串口。

第6行:读取串口,在硬件回环的情况下,会读到这个字符。


2. open_port函数分析

代码如下:

左右滑动查看完整内容

int open_port(char *com){int fd;//fd = open(com, O_RDWR|O_NOCTTY|O_NDELAY); fd = open(com, O_RDWR|O_NOCTTY); if (-1 == fd){return(-1); }
//if(fcntl(fd, F_SETFL, 0)<0) /* 设置串口 Flag *///{ // printf("fcntl failed!\n"); // return -1;//}
return fd; }


第5行:打开串口设备。


3. set_opt函数分析

代码如下:

左右滑动查看完整内容

 /* set_opt(fd,115200,8,'N',1) */ int set_opt(int fd,int nSpeed, int nBits, char nEvent, int nStop){struct termios newtio,oldtio;
if ( tcgetattr( fd,&oldtio) != 0) { perror("SetupSerial 1"); return -1; }
bzero( &newtio, sizeof( newtio ) ); newtio.c_cflag |= CLOCAL | CREAD; newtio.c_cflag &= ~CSIZE;
newtio.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); /*Input*/ newtio.c_oflag &= ~OPOST; /*Output*/
switch( nBits ) { case 7: newtio.c_cflag |= CS7;break;case 8:newtio.c_cflag |= CS8; break;}
switch( nEvent ) { case 'O': newtio.c_cflag |= PARENB;newtio.c_cflag |= PARODD;newtio.c_iflag |= (INPCK | ISTRIP);break;case 'E':newtio.c_iflag |= (INPCK | ISTRIP);newtio.c_cflag |= PARENB;newtio.c_cflag &= ~PARODD;break;case 'N':newtio.c_cflag &= ~PARENB; break;}
switch( nSpeed ) {case 2400:cfsetispeed(&newtio, B2400);cfsetospeed(&newtio, B2400);break;case 4800:cfsetispeed(&newtio, B4800);cfsetospeed(&newtio, B4800);break;case 9600:cfsetispeed(&newtio, B9600);cfsetospeed(&newtio, B9600);break;case 115200:cfsetispeed(&newtio, B115200);cfsetospeed(&newtio, B115200);break;default:cfsetispeed(&newtio, B9600);cfsetospeed(&newtio, B9600);break; }
if( nStop == 1 )newtio.c_cflag &= ~CSTOPB;else if ( nStop == 2 )newtio.c_cflag |= CSTOPB;
newtio.c_cc[VMIN] = 1; /* 读数据时的最小字节数: 没读到这些数据我就不返回! */newtio.c_cc[VTIME] = 0; /* 等待第 1 个数据的时间: * 比如 VMIN 设为 10 表示至少读到 10 个数据才返回, * 但是没有数据总不能一直等吧? 可以设置 VTIME(单位是 10 秒) * 假设 VTIME=1,表示: * 10 秒内一个数据都没有的话就返回 * 如果 10 秒内至少读到了 1 个字节,那就继续等待,完全读到VMIN 个数据再返回 */
tcflush(fd,TCIFLUSH);
if((tcsetattr(fd,TCSANOW,&newtio))!=0) { perror("com set error"); return -1; } //printf("set done!\n"); return 0; }


4.2.3 上机实验

在Ubuntu上执行如下命令进行编译:

左右滑动查看完整内容

$ source /opt/remi-sdk/environment-setup-aarch64-poky-linux$ $CC -o serial_send_recv serial_send_recv.c$ scp serial_send_recv root@192.168.5.9:/home/root


在开发板上执行如下命令,然后输入“1”回车、输入“2”回车:

# cd /home/root/# ./serial_send_recv /dev/ttySC4Enter a char: 1get: 31 1get: 0a2get: 32 2get: 0a


上面的“get:311”表示读到了一个字符,它的16进制数值是 0x31,字符为“1”


4.3 普通串口应用编程(GPS模块实验)

4.3.1 GPS简介

全球定位系统(Global Positioning System,GPS)是一种以空中卫星为基础的高精度无线电导航的定位系统,它在全球任何地方以及近地空间都能够提供准确的地理位置、车行速度及精确的时间信息。GPS主要由三大组成部分:空间部分、地面监控部分和用户设备部分。GPS系统具有高精度、全天候、用广泛等特点。


太空卫星部分由多颗卫星组成,分成多个轨道,绕行地球一周约12小时。每个卫星均持续发射载有卫星轨道数据及时间的无线电波,提供地球上的各种接收机来应用。


地面管制部分,这是为了追踪及控制太空卫星运行所设置的地面管制站,主要工作为负责修正与维护每个卫星能够正常运转的各项参数数据,以确保每个卫星都能够提供正确的讯息给使用者接收机来接收。


使用者接收机(即用户设备),追踪所有的GPS卫星,并实时的计算出接收机所在位置的坐标、移动速度及时间。我们日常接触到的是用户设备部分,这里使用到的GPS模块即为用户设备接收机部分。


4.3.2 GPS模块硬件

GPS模块与外部控制器的通讯接口有多种方式,这里我们使用串口进行通讯,波特率为9600bps,1bit停止位,无校验位,无流控,默认每秒输出一次标准格式数据。


GPS模块外观如下图所示,通过排线与控制器进行供电和通讯。该模块为集成模块,没有相关原理图。

图4.2 GPS模块


GPS使用多种标准数据格式,目前最通用的GNSS格式是 NMEA0183格式。NMEA0183是最终定位格式,即将二进制定位格式转为统一标准定位格式,与卫星类型无关。这是一套定义接收机输出的标准信息,有几种不同的格式,每种都是独立相关的ASCII格式,逗点隔开数据流,数据流长度从30-100字符不等,通常以每秒间隔持续输出。


NVMEA0183格式主要针对民用定位导航,与专业 RTCM2.3/3.0和CMR+的GNSS数据格式不同。通过 NMEA0183格式,可以实现GNSS接收机与PC或PDA之间的数据交换,可以通过USB和COM口等通用数据接口进行数据传输,其兼容性高,数据传输稳定。这里我们使用串口进行是通讯,通信框图如下图所示。

图4.3 NVMEA0183格式


我们使用串口接收数据,收到的数据包含:$GPGGA(GPS定位数据)、$GPGLL(地理定位信息)、$GPGSA(当前卫星信息)、$GPGSV(可见卫星状态信息)、$GPRMC(推荐最小定位信息)、$GPVTG(地面速度信息)。


这里我们只分析$GPGGA(Global Positioning System Fix Data)即可,它包含了GPS定位经纬度、质量因子、HDOP、高程、参考站号等字段。其标准格式如下:

左右滑动查看完整内容

$GPGGA,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,M,<10>,M,<11>,<12>*hh


$XXGGA语句各字段的含义和取值范围各字段的含义和取值范围见下表所示,XX取值有:

▪ GPGGA:单GPS

▪ BDGGA:单北斗

▪ GLGGA:单GLONASS

▪ GNGGA:多星联合定位


表4-2 $XXGGA字段


例子:$GPGGA,074529.82,2429.6717,N,11804.6973,E,1,8,1.098,42.110,,,M,,*76。


4.3.3 硬件连接

硬件连接原理图如下:


实物连接图如下:

图4.4 GPS模块硬件连接


4.3.4 程序解析本

节源码位于如下目录:


1. 程序主流程分析

在main函数了,打开串口、设置串口参数后,就直接读取 GPS原始数据、解析数据,代码如下:

左右滑动查看完整内容

 while (1) { /* eg. $GPGGA,082559.00,4005.22599,N,11632.58234,E,1,04,3.08,14.6,M,-5.6,M,,*76"*/ /* read line */ iRet = read_gps_raw_data(fd, buf);
/* parse line */ if (iRet == 0) {iRet = parse_gps_raw_data(buf, time, Lat, ns, Lng, ew); }
/* printf */ if (iRet == 0) { printf("Time : %s\n", time); printf("ns : %s\n", ns); printf("ew : %s\n", ew); printf("Lat : %s\n", Lat); printf("Lng : %s\n", Lng);
/* 纬度格式: ddmm.mmmm */ sscanf(Lat+2, "%f", &fLat); fLat = fLat / 60; fLat += (Lat[0] - '0')*10 + (Lat[1] - '0');
/* 经度格式: dddmm.mmmm */ sscanf(Lng+3, "%f", &fLng); fLng = fLng / 60; fLng += (Lng[0] - '0')*100 + (Lng[1] - '0')*10 + (Lng[2] - '0'); printf("Lng,Lat: %.06f,%.06f\n", fLng, fLat); } }


第6行:读取GPS原始数据。

第11行:解析数据。

第15~33行:打印数据。


2. 读取GPS原始数据

代码如下:

左右滑动查看完整内容

 int read_gps_raw_data(int fd, char *buf){ int i = 0;int iRet; char c; int start = 0;
while (1) {iRet = read(fd, &c, 1); if (iRet == 1) {if (c == '$')start = 1; if (start){ buf[i++] = c; } if (c == '\n' || c == '\r') return 0; }else { return -1; } } }


第10行:读取数据。

第13行:碰到“$”字符,表示新的一行数据开始了。

第19~20行:碰到回车换行,表示数据接收完毕。


3. 解析GPS数据

代码如下:

左右滑动查看完整内容

 /* eg. $GPGGA,082559.00,4005.22599,N,11632.58234,E,1,04,3.08,14.6,M,-5.6,M,,*76" */ int parse_gps_raw_data(char *buf, char *time, char *lat, char *ns, char *lng, char *ew){ char tmp[10];
if (buf[0] != '$') return -1; else if (strncmp(buf+3, "GGA", 3) != 0) return -1; else if (strstr(buf, ",,,,,")) { printf("Place the GPS to open area\n");
return -1; } else { //printf("raw data: %s\n", buf); sscanf(buf, "%[^,],%[^,],%[^,],%[^,],%[^,],%[^,]", tmp, time, lat, ns,lng, ew);return 0;} }


第7、9、11行:发现数据不对的话,返回错误。

第19行:解析数据。


4.3.5 上机实验

在Ubuntu上执行如下命令进行编译:

左右滑动查看完整内容

$ source /opt/remi-sdk/environment-setup-aarch64-poky-linux$ $CC -o gps_read gps_read.c$ scp gps_read root@192.168.5.9:/home/root


把模块放到开阔的地方,在开发板上执行如下命令:

# cd /home/root/# ./gps_read /dev/ttySC4


需要技术支持?

如您在使用瑞萨MCU/MPU产品中有任何问题,可识别下方二维码或复制网址到浏览器中打开,进入瑞萨技术论坛寻找答案或获取在线技术支持。

https://community-ja.renesas.com/zh/forums-groups/mcu-mpu/



未完待续


推荐阅读

即刻预约 | 瑞萨RZ/G通用MPU研讨会,现场送瑞米派!

VLP中添加客户的RZ/G2L板子编译

RZ/V2L ISP实现方式及功能简介

更多精彩,敬请关注


评论
  • 一、SAE J1939协议概述SAE J1939协议是由美国汽车工程师协会(SAE,Society of Automotive Engineers)定义的一种用于重型车辆和工业设备中的通信协议,主要应用于车辆和设备之间的实时数据交换。J1939基于CAN(Controller Area Network)总线技术,使用29bit的扩展标识符和扩展数据帧,CAN通信速率为250Kbps,用于车载电子控制单元(ECU)之间的通信和控制。小北同学在之前也对J1939协议做过扫盲科普【科普系列】SAE J
    北汇信息 2024-12-11 15:45 119浏览
  • 全球知名半导体制造商ROHM Co., Ltd.(以下简称“罗姆”)宣布与Taiwan Semiconductor Manufacturing Company Limited(以下简称“台积公司”)就车载氮化镓功率器件的开发和量产事宜建立战略合作伙伴关系。通过该合作关系,双方将致力于将罗姆的氮化镓器件开发技术与台积公司业界先进的GaN-on-Silicon工艺技术优势结合起来,满足市场对高耐压和高频特性优异的功率元器件日益增长的需求。氮化镓功率器件目前主要被用于AC适配器和服务器电源等消费电子和
    电子资讯报 2024-12-10 17:09 101浏览
  • 首先在gitee上打个广告:ad5d2f3b647444a88b6f7f9555fd681f.mp4 · 丙丁先生/香河英茂工作室中国 - Gitee.com丙丁先生 (mr-bingding) - Gitee.com2024年对我来说是充满挑战和机遇的一年。在这一年里,我不仅进行了多个开发板的测评,还尝试了多种不同的项目和技术。今天,我想分享一下这一年的故事,希望能给大家带来一些启发和乐趣。 年初的时候,我开始对各种开发板进行测评。从STM32WBA55CG到瑞萨、平头哥和平海的开发板,我都
    丙丁先生 2024-12-11 20:14 81浏览
  • 习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习笔记&记录学习习笔记&记学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记
    youyeye 2024-12-12 10:13 55浏览
  • 铁氧体芯片是一种基于铁氧体磁性材料制成的芯片,在通信、传感器、储能等领域有着广泛的应用。铁氧体磁性材料能够通过外加磁场调控其导电性质和反射性质,因此在信号处理和传感器技术方面有着独特的优势。以下是对半导体划片机在铁氧体划切领域应用的详细阐述: 一、半导体划片机的工作原理与特点半导体划片机是一种使用刀片或通过激光等方式高精度切割被加工物的装置,是半导体后道封测中晶圆切割和WLP切割环节的关键设备。它结合了水气电、空气静压高速主轴、精密机械传动、传感器及自动化控制等先进技术,具有高精度、高
    博捷芯划片机 2024-12-12 09:16 93浏览
  • RK3506 是瑞芯微推出的MPU产品,芯片制程为22nm,定位于轻量级、低成本解决方案。该MPU具有低功耗、外设接口丰富、实时性高的特点,适合用多种工商业场景。本文将基于RK3506的设计特点,为大家分析其应用场景。RK3506核心板主要分为三个型号,各型号间的区别如下图:​图 1  RK3506核心板处理器型号场景1:显示HMIRK3506核心板显示接口支持RGB、MIPI、QSPI输出,且支持2D图形加速,轻松运行QT、LVGL等GUI,最快3S内开
    万象奥科 2024-12-11 15:42 91浏览
  • 近日,搭载紫光展锐W517芯片平台的INMO GO2由影目科技正式推出。作为全球首款专为商务场景设计的智能翻译眼镜,INMO GO2 以“快、准、稳”三大核心优势,突破传统翻译产品局限,为全球商务人士带来高效、自然、稳定的跨语言交流体验。 INMO GO2内置的W517芯片,是紫光展锐4G旗舰级智能穿戴平台,采用四核处理器,具有高性能、低功耗的优势,内置超微高集成技术,采用先进工艺,计算能力相比同档位竞品提升4倍,强大的性能提供更加多样化的应用场景。【视频见P盘链接】 依托“
    紫光展锐 2024-12-11 11:50 80浏览
  • 应用环境与极具挑战性的测试需求在服务器制造领域里,系统整合测试(System Integration Test;SIT)是确保产品质量和性能的关键步骤。随着服务器系统的复杂性不断提升,包括:多种硬件组件、操作系统、虚拟化平台以及各种应用程序和服务的整合,服务器制造商面临着更有挑战性的测试需求。这些挑战主要体现在以下五个方面:1. 硬件和软件的高度整合:现代服务器通常包括多个处理器、内存模块、储存设备和网络接口。这些硬件组件必须与操作系统及应用软件无缝整合。SIT测试可以帮助制造商确保这些不同组件
    百佳泰测试实验室 2024-12-12 17:45 84浏览
  • 全球智能电视时代来临这年头若是消费者想随意地从各个通路中选购电视时,不难发现目前市场上的产品都已是具有智能联网功能的智能电视了,可以宣告智能电视的普及时代已到临!Google从2021年开始大力推广Google TV(即原Android TV的升级版),其他各大品牌商也都跟进推出搭载Google TV操作系统的机种,除了Google TV外,LG、Samsung、Panasonic等大厂牌也开发出自家的智能电视平台,可以看出各家业者都一致地看好这块大饼。智能电视的Wi-Fi连线怎么消失了?智能电
    百佳泰测试实验室 2024-12-12 17:33 77浏览
  • 在智能化技术快速发展当下,图像数据的采集与处理逐渐成为自动驾驶、工业等领域的一项关键技术。高质量的图像数据采集与算法集成测试都是确保系统性能和可靠性的关键。随着技术的不断进步,对于图像数据的采集、处理和分析的需求日益增长,这不仅要求我们拥有高性能的相机硬件,还要求我们能够高效地集成和测试各种算法。我们探索了一种多源相机数据采集与算法集成测试方案,能够满足不同应用场景下对图像采集和算法测试的多样化需求,确保数据的准确性和算法的有效性。一、相机组成相机一般由镜头(Lens),图像传感器(Image
    康谋 2024-12-12 09:45 98浏览
  • 本文介绍瑞芯微RK3588主板/开发板Android12系统下,APK签名文件生成方法。触觉智能EVB3588开发板演示,搭载了瑞芯微RK3588芯片,该开发板是核心板加底板设计,音视频接口、通信接口等各类接口一应俱全,可帮助企业提高产品开发效率,缩短上市时间,降低成本和设计风险。工具准备下载Keytool-ImportKeyPair工具在源码:build/target/product/security/系统初始签名文件目录中,将以下三个文件拷贝出来:platform.pem;platform.
    Industio_触觉智能 2024-12-12 10:27 90浏览
  • 我的一台很多年前人家不要了的九十年代SONY台式组合音响,接手时只有CD功能不行了,因为不需要,也就没修,只使用收音机、磁带机和外接信号功能就够了。最近五年在外地,就断电闲置,没使用了。今年9月回到家里,就一个劲儿地忙着收拾家当,忙了一个多月,太多事啦!修了电气,清理了闲置不用了的电器和电子,就是一个劲儿地扔扔扔!几十年的“工匠式”收留收藏,只能断舍离,拆解不过来的了。一天,忽然感觉室内有股臭味,用鼻子的嗅觉功能朝着臭味重的方向寻找,觉得应该就是这台组合音响?怎么会呢?这无机物的东西不会腐臭吧?
    自做自受 2024-12-10 16:34 188浏览
  • 天问Block和Mixly是两个不同的编程工具,分别在单片机开发和教育编程领域有各自的应用。以下是对它们的详细比较: 基本定义 天问Block:天问Block是一个基于区块链技术的数字身份验证和数据交换平台。它的目标是为用户提供一个安全、去中心化、可信任的数字身份验证和数据交换解决方案。 Mixly:Mixly是一款由北京师范大学教育学部创客教育实验室开发的图形化编程软件,旨在为初学者提供一个易于学习和使用的Arduino编程环境。 主要功能 天问Block:支持STC全系列8位单片机,32位
    丙丁先生 2024-12-11 13:15 71浏览
  • 时源芯微——RE超标整机定位与解决详细流程一、 初步测量与问题确认使用专业的电磁辐射测量设备,对整机的辐射发射进行精确测量。确认是否存在RE超标问题,并记录超标频段和幅度。二、电缆检查与处理若存在信号电缆:步骤一:拔掉所有信号电缆,仅保留电源线,再次测量整机的辐射发射。若测量合格:判定问题出在信号电缆上,可能是电缆的共模电流导致。逐一连接信号电缆,每次连接后测量,定位具体哪根电缆或接口导致超标。对问题电缆进行处理,如加共模扼流圈、滤波器,或优化电缆布局和屏蔽。重新连接所有电缆,再次测量
    时源芯微 2024-12-11 17:11 123浏览
  • 习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习笔记&记录学习习笔记&记学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记
    youyeye 2024-12-11 17:58 94浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦