树莓派4B学习笔记——IO通信篇(UART)
文章目录UART简介树莓派使用UART与串口屏通信串口屏简介硬件连接配置串口接口树莓派打开UART接口树莓派安装串口调试助手编程实现wiringSerial.h Serial简介C语言实现树莓派UART与串口屏通信总结树莓派4B入门学习笔记汇总UART简介UART是一种通用串行数据总线用于异步通信。该总线双向通信可以实现全双工传输和接收。在嵌入式设计中UART用来主机与辅助设备通信如汽车音响与外接AP之间的通信与PC机通信包括与监控调试器和其它器件多用于上位机与下位机的通信。在UART通信中两个UART直接相互通信。 发送UART将控制设备如CPU的并行数据转换为串行形式以串行方式将其发送到接收UART。只需要两条线即可在两个UART之间传输数据数据从发送UART的Tx引脚流到接收UART的Rx引脚波特率每秒传输二进制位数。例1分钟传输数据57600BYTE帧格式10位求波特率二进位57600*10576000/60 9600bit/sUART属于异步通讯这意味着没有时钟信号取而代之的是在数据包中添加起始和停止位。这些位定义了数据包的开始和结束通过识别起始位和结束位可以解析出数据。帧格式1位起始位(5-8)位数据1位奇偶校验位(1~2)位停止位 10位奇校验数据位上的1的个数校验位上1的个数和位奇数。数据包的传输示意图上图来自此文。①串口是什么串口就是一种通信方式TX和RX②串口通信的特点异步 全双工 串行③串口通信数据帧起始位 数据位(8) 【奇偶校验】 停止位有关串口的详细介绍参考此文。树莓派使用UART与串口屏通信今天主要借助陶晶驰串口屏配合树莓派4B实现一个通信效果。串口屏简介串口屏内置一块STM32构建了相对独立的系统有配套的软件能够进行图形化编程极大地降低了界面设计的时间和难度而且还有各种控件以便于灵活实现更多功能可以通过串口完成对各类控件的操作有很强的实用性。有关陶晶驰串口屏的具体使用可以参考官网的资料。硬件连接将串口屏的TX、RX与树莓派的UART硬件接口连接注意交叉。(没有屏幕的同学也可以使用USB转TTL连接树莓派然后安装陶晶驰的开发环境在线仿真也可。)树莓派串口屏5VVCC板载编码8脚TXRX板载编码10脚RXTXGNDGND配置串口接口树莓派一共有两个串口如下图所示来自B站树小悉这里还需要注意树莓派的串口分为了主串口和辅助串口硬件串口标识符为ttyAMA0主串口标识符为serial0辅助串口的标识符为serial1。本此介绍使用的是硬件串口和主串口利用引脚通信。树莓派打开UART接口跟之前类似打开Serial Port关闭Serail Console点击OK会提示重启。点击Yes等待重启。重启完毕后打开命令终端输入ls /dev -al回车。若重启失败先把串口屏拔下来重启完毕后再接上去下拉找到串口此时发现主串口serial0指向了mini串口辅助串口serial1指向了硬件串口ttyAM0;这与我们所需要将主串口指向硬件串口所以需要进一步修改配置。利用nano编辑器打开并修改config.txt具体步骤如下1在终端输入sudo nano /boot/config.txt回车弹出下图画面利用滚轮来到文件末尾。2添加如下代码dtoverlaypi3-miniuart-btforce_turbo1按CtrlS保存CtrlX返回。然后再次重启树莓派输入sudo reboot 等待重启完成再次打开终端输入ls /dev -al回车此时上滑找到串口发现已经修改为主串口指向硬件串口了。树莓派安装串口调试助手为了验证树莓派串口有没有真的工作需要安装一个minicom的串口助手来验证一下。安装步骤打开终端输入sudo apt-get install minicom回车等待下载和安装安装过程中有提示直接输入Y回车。安装完成后需要先将USB转TTL连接到树莓派然后打开电脑的串口调试助手连接到CH340波特率9600八位数据一位停止。同时打开树莓派的串口助手在终端输入命令minicom -D /dev/ttyAMA0 -b 9600回车即可进入。在电脑端输入abcd点击发送可以发现在树莓派上有了显示表示串口开启OK。此时我们需要退出minicom ,退出步骤首先CtrlA然后按Z最后按X选是即可退出。编程实现验证了串口功能后我们开始利用串口编程在编程之前根据前面的经验我还是需要先了解一下WiringPi的串口库给我们提供了哪些可以调用的函数。之前一直没提这个库是怎么查询的在这里说明一下安装后wiringpi的库后我们可以载可以在/usr/linclude找到wiringPi相关的头文件如下图所示wiringPi.h基本IO驱动和常用配置定义wiringPiI2C.h I2C驱动的头文件wiringPiSPI.h SPI驱动的头文件;wiringSerial.h Serial驱动的头文件;wiringSerial.h Serial简介双击wiringSerial.h Serial.h我们可以看见有以下几个函数具体解释转载与此文。extern int serialOpen (const char *device, const int baud) ;//打开串口输入设备描述符和串口波特率返回串口的设备IDextern void serialClose (const int fd) ;//关闭串口extern void serialFlush (const int fd) ;//清空缓存区extern void serialPutchar (const int fd, const unsigned char c) ;//输出一个字符extern void serialPuts (const int fd, const char *s) ;//输出字符串extern void serialPrintf (const int fd, const char *message, …) ;//格式化输出extern int serialDataAvail (const int fd) ;//返回设备缓存区接收到的数据个数extern int serialGetchar (const int fd) ;//从设备ID读取一个字符C语言实现此处转载的此文。打开Geany输入以下代码// An highlighted block#includewiringPi.h#includewiringSerial.h#includestdio.h#includestring.h#includetime.hvoiddelay_ms(int ms);intmain(){int filedevid;int recbytenum;int i;char buf[1024];memset(buf,0,1024);wiringPiSetup();if((filedevidserialOpen(/dev/ttyAMA0,115200))0)//打开串口{printf(/dev/ttyAMA0 Open Faild\r\n);return-1;}else{printf(/dev/ttyAMA0 Open with 115200, success\r\n);while(1){recbytenumserialDataAvail(filedevid);//记录接受到的数据个数if(recbytenum1)//如果接收到{i0;while(recbytenum--){buf[i]serialGetchar(filedevid);//读出缓存区的数据}printf(Rpi uart recv: %s\r\n,buf);输出在终端serialPrintf(filedevid,Rpi uart send: %s\r\n,buf);//通过串口打印到上位机啊。memset(buf,0,1024);}}}}上述代码效果如下树莓派UART与串口屏通信C语言代码如下//树莓派通过串口屏输出两个通道正弦波形。#includewiringPi.h#includewiringSerial.h#includestdio.h#includestring.h#includetime.h#define uchar unsigned char #define uint unsigned int int filedevid;int second,minute,hour,day,month,week,year,zwc,fwc,wdc,bal,txt,wendu;char endbuf[]{0xff,0xff,0xff};char buf[64];//////唤醒屏幕准备通信voidUART_Send_start(void){delay(10);serialPuts(filedevid,(char*)endbuf);//发送结束标志0xff,0xff,0xff包尾delay(10);}intmain(){uint ch0,ch1;signed int i,j;second50;minute48;hour12;day15;month7;week2;year16;bal0;txt0;wendu0;wiringPiSetup();if((filedevidserialOpen(/dev/ttyAMA0,9600))0)//打开串口{printf(/dev/ttyAMA0 Open Faild\r\n);return-1;}else{printf(/dev/ttyAMA0 Open with 9600, success\r\n);UART_Send_start();//初始化串口屏serialPuts(filedevid,page 0);//切换到初始页面serialPuts(filedevid,(char*)endbuf);//发送结束标志0xff,0xff,0xff包尾delay(1000);//等待屏幕启动while(1){j32;for(i0;isizeof(zhengxianbo);i)//正弦波显示{ch0zhengxianbo[i]/340;ch1zhengxianbo[j]/340;if(jsizeof(zhengxianbo))j0;sprintf(buf,add 1,0,%d,ch0);//将波形数据打包serialPuts(filedevid,(char*)buf);serialPuts(filedevid,(char*)endbuf);//发送结束标志0xff,0xff,0xff包尾sprintf(buf,add 1,1,%d,ch1);//将波形数据打包serialPuts(filedevid,(char*)buf);serialPuts(filedevid,(char*)endbuf);//发送结束标志0xff,0xff,0xff包尾}}}}//此处展示的代码不全有需要的点赞收藏私信笔者免费获取。效果如下总结有关树莓派串口的记录就到这里到此笔者关于树莓派的基础部分笔记也就结束了后面会根据情况更新进阶版的前面有关内容如果存在不妥之处欢迎批评指正此系列到此基本画上了句号。如果觉得对你有帮助记得点赞收藏加关注。树莓派4B入门学习笔记汇总树莓派4B学习笔记——系统烧录及初次开机树莓派4B学习笔记——点亮你的LED树莓派4B学习笔记——IO输入检测树莓派4B学习笔记——IO通信篇I2C树莓派4B学习笔记——IO通信篇SPI树莓派4B学习笔记——IO通信篇1-Wire树莓派4B学习笔记——IO通信篇UART