文章目录
1.串口通信协议
1.1全双工、半双工(简单理解)
-
全双工好比两个人可以互相讲话
-
半双工好比,两个人讲话时只能是一个人讲话,一个人听着
1.2串口通信概念
- 串口通信用于多机通信
- 串口通信属于全双工通信,即双方可以同时进行交流
半双工通信,一次只允许一方进行通信 - 树莓派进行串口通信一般要连接两根线TXD和RXD,
连接时要相反连接(即树莓派的TXD要与通信方的RXD相连,RXD与TXD相连) - 进行串口通信时,数据格式(数据位、停止位、奇偶校验位)和波特率,通信双方要保持一致
1.3串口通信关注点
-
数据格式(好比语言),包括数据位、停止位、奇偶校验位
-
波特率(好比语速),比如常用的波特率:115200
2.串口通信编程
当树莓派刚刷完机之后,它的硬件串口(/dev/ttyAMA0)默认是分配给板载蓝牙使用的,因此无法通过串口进行登录。这个时候就需要对串口进行配置,才能够通过MobaXterm等软件以Serial的方式登录到树莓派的终端上。
2.1 串口配置
(1)修改cmdline.text文件
sudo vi /boot/cmdline.txt
2) 删除【】之间的部分:【console=ttyAMA0,115200】这部分删除
该语句作用为树莓派启动时用串口来打印调试信息,使用串口通信则需删除
dwc_otg.lpm_enable=0 【console=ttyAMA0,115200】 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait
(3)重启树莓派
sudo reboot
2.2接线
树莓派与USB转TTL相连
TXD —— RXD
RXD —— TXD
0 V —— GND
2.3串口通信相关的API
使用时需要包含头文件:#include <wiringSerial.h>
(1)serialOpen——打开并初始串口
int serialOpen (char *device, int baud)
device: 串口的地址,默认是"/dev/ttyAMA0"
baud: 波特率,比如9600,或者115200
返回: 正常返回文件描述符,否则返回-1失败。
(2)serialPutchar——发送一个字节的数据到串口
void serialPutchar (int fd, unsigned char c)
fd: 文件描述符
c: 要发送的数据
(3)serialPuts——发送一个字符串到串口
void serialPuts (int fd, char *s)
fd: 文件描述符
s: 发送的字符串,字符串要以'\0'结尾
(4)serialGetchar——读取串口数据
int serialGetchar (int fd)
fd: 文件描述符
返回: 读取到的字符
如果串口缓存中没有可用的数据,则会等待10秒,如果10后还有没,返回-1,
所以,在读取前,做好通过serialDataAvail判断下
(5)serialDataAvail——判断读取的串口是否有数据
int serialDataAvail (int fd)
fd: 文件描述符
返回: 判断读取的串口是否有数据,有数据返回读取的字节数,无数据,返回-1
(6)serialClose——关闭fd关联的串口
void serialClose (int fd)
fd:文件描述符
2.4示例代码
2.4.1示例代码1(发送一个字符串到串口 )
#include <stdio.h>
#include <wiringSerial.h>
#include <wiringPi.h>
int main(){
int fd;
wiringPiSetup();//初始化
fd = serialOpen("dev/ttyAMAO",9600); //打开并初始化串口
while(1){
//serialPutchar(fd,'c'); //发送一个字节数据到串口
serialPuts(fd,"china very good \r\n"); //发送一个字符串到串口
delayMicroseconds(1000000); //每隔1秒发送一次
}
serialClose(fd); //关闭串口
return 0;
}
2.4.2示例代码2(读取串口数据)
#include <stdio.h>
#include <wiringPi.h>
#include <wiringSerial.h>
int main(){
int fd;
int cmd;
if(wiringPiSetup()==-1){
printf("初始化失败\n");
return -1;
}
fd = serialOpen("/dev/ttyAMA0",9600);
while(1){
while(serialDataAvail(fd)!=-1){
cmd = serialGetchar(fd);
//printf("data: %d\n",cmd);
//printf("data: %c\n",cmd);
if(cmd=='2'){
serialPuts(fd,"data is 2\r\n");
}
if(cmd=='3'){
serialPuts(fd,"data is 3\r\n");
}
if(cmd=='4'){
serialPuts(fd,"data is 4\r\n");
}
}
}
return 0;
}