新网站提交百度收录,无锡网页设计排名,外链的论坛网站,网站服务器有什么区别目录
一 串口说明
二 USB—TTL模块
● usb-ttl模块接口
三 串口通信常用的API
四 修改串口的配置文件
五 串口通信代码验证
● 发送一个字符/字符串到串口
● 树莓读取串口数据#xff08;字符#xff09;
● 代码拓展#xff08;双方#xff09; 一 串口…目录
一 串口说明
二 USB—TTL模块
● usb-ttl模块接口
三 串口通信常用的API
四 修改串口的配置文件
五 串口通信代码验证
● 发送一个字符/字符串到串口
● 树莓读取串口数据字符
● 代码拓展双方 一 串口说明
我在基于全志H6实现Linux串口通信这篇文章中也有详解介绍点击查看详细内容
① 串口通信经常使用在多机通信中。不管是软件还是硬件都存在模块化的编程思想。 ● 半双工A传数据给BB只接收数据什么也不能做 ● 全双工A传数据给B的同时B也能给A传输数据 ② 实现串口多机通信的协议设置串口号数据格式和波特率。 ● 串口号CH340软件来接收或生成串口号 ● 波特率好比人的语速常用的1152009600 ● 数据格式可以比作人交流的语种。数据位奇偶校验位停止位。 类似于人和人在交流沟通时都必须使用同一种语言和语速这样通信双方才能明白对方的内容。 二 USB—TTL模块
作用将通信双方识别的电平转换为通信电平。 ● 我们常用的单片机引出来的串口如果不加其他的接口电路出来的信号就是TTL电平 ● 如果需要看串口的打印信息一般是需要接一个上位机的常规的就是电脑而现在的电脑一般的通信接口只有USB ● 对于USB口而言是没法和TTL串口直接通信的因为接口不匹配电平也不匹配这时候就需要借助其它设备来实现接口与电平的转换 ● 常规操作是使用CH340这种芯片所制作的USB转串口模块这个模块就可以实现TTL串口和USB之前的转换。 ● usb-ttl模块接口 ● RXD 数据输入引脚数据接收 ● TXD 数据发送引脚数据发送 接线说明如图
在树莓派接入USB-TTL模块时除了交叉连接RXD和TXD两端最好在接入GND保持电平的稳定。 三 串口通信常用的API
头文件#include wiringSerial.h
① int serialOpen (char *device, int baud) 作用打开并初始化串口 ● device:串口的地址在Linux中就是设备所在的目录。默认一般是/dev/ttyAMA0。 ● baud波特率 ● 返回值正常返回文件描述符fd否则返回-1失败。 ② void serialClose (int fd) 作用关闭fd关联的串口 ● fd文件描述符 ③ void serialPutchar (int fd, unsigned char c) 作用发送一个字节的数据到串口 ● fd:文件描述符 ● c:要发送的字符数据 ④ void serialPuts (int fd, char *s) 作用发送一个字符串到串口 ● fd文件描述符 ● s发送的字符串字符串要以\0结尾 ⑤ int serialDataAvail (int fd) 作用获取串口缓存中可用的字节数。 ● fd文件描述符 ● 返回串口缓存中已经接收的可读取的字节数-1代表错误 ⑥ int serialGetchar (int fd) 作用从串口读取一个字节数据返回。 说明如果串口缓存中没有可用的数据则会等待10秒如果10后还有没返回-1。所以在读取前做好通过serialDataAvail判断下。 ● fd文件描述符 ● 返回值读取到的字符 四 修改串口的配置文件
在使用串口通信之前一定要修改相关配置文件不然容易出错。 ① cd /boot/ 进入系统根目录中的boot目录 ② sudo vim cmdline.tx 用超级用户权限打开cmdline.tx文件内容如图 ③ 删除圈中的部分保存退出 ④ sudo reboot重启即可 五 串口通信代码验证
● 发送一个字符/字符串到串口
#include stdio.h
#include wiringSerial.h//串口头文件
#include wiringPi.hint main()
{int fd; //文件描述符if(wiringPiSetup() -1){ //初始化库printf(init wiringPi error!\n);return -1;}fd serialOpen(/dev/ttyAMA0,115200);//初始/打开/创建串口并设置波特率while(1){// serialPutchar(fd,a); //发送一个字符serialPuts(fd,hello pi!\r\n); //发送一个字符串到串口\r\n串口中换行delayMicroseconds(1000000); //延时设置1000000us 1s每隔1s就发送}return 0;
} ● 树莓读取串口数据字符
#include stdio.h
#include wiringPi.h
#include wiringSerial.hint main()
{int fd;int cmd;if(wiringPiSetup() -1){printf(init wiringPi error!\n);return -1;}fd serialOpen(/dev/ttyAMA0,115200);while(serialDataAvail(fd) ! -1){ //初始化serialDataAvail()函数cmd serialGetchar(fd); //cmd接收该函数的返回值一个字符printf(get data:%c\n,cmd);}serialClose(fd);//退出return 0;
} ● 代码拓展双方
#include stdio.h
#include wiringPi.h
#include wiringSerial.hint main()
{int fd;int cmd;if(wiringPiSetup() -1){printf(init wiringPi error!\n);return -1;}fd serialOpen(/dev/ttyAMA0,115200);while(serialDataAvail(fd) ! -1){ //初始化serialDataAvail()函数cmd serialGetchar(fd); //cmd接收该函数的返回值一个字符printf(get data:%c\n,cmd);if(cmd 2){serialPuts(fd,hello 2\r\n);//串口中换行\r\n结合使用}if(cmd 3){ //树莓收到字符3时就发送hello 3这个字符串到串口serialPuts(fd,hello 3\r\n);}if(cmd 4){serialPuts(fd,hello 4\r\n);}}serialClose(fd);//退出return 0;
}