树莓派学习笔记(五)串口通信

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;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值