相关概念
简述半双工与全双工
全双工允许通信双方同时互传数据;半双工不可同时,一方发送时,另一方只能接收。串口通信属于全双工。
全双工即两个人可以互相说话,半双工即一个人说话另一个人只能听着
串口通信注重什么
数据格式:即语言要通
数据位,停止位,奇偶校验位
波特率:语速要通
波特率(Baud Rate) 单位 bps – 每秒传送的 字节数 Byte Per Second.。
初次使用需要配置
①修改 cmdline.txt 文件
cd /boot/
sudo vim cmdline.txt
删除字符串” console=serial0,115200“
②重启
sudo reboot
树莓派和电脑串口之间读、写、交互
树莓派向串口发送字符和字符串:
#include <wiringPi.h>
#include <wiringSerial.h>
#include <stdio.h>
int main()
{
int fd;
if(-1 == wiringPiSetup()){
printf("硬件初始化失败\n");
}
fd = serialOpen("/dev/ttyAMA0",9600);
while(1){
serialPutchar(fd,'c');
//serialPuts(fd,"Hello World!\r\n"); // \r回车 \n换行
delayMicroseconds(1000000);//微妙函数
}
return 0;
}
拓展:若要用于执行指令,例如手机控制继电器等,可参考下列代码
int cmd;
while(1){
while(serialDataAvail(fd) != -1){//当缓冲区有数据时
cmd = serialGetchar(fd);
printf("cmd = %c\n",cmd);
if(cmd == '5'){
serialPuts(fd,"do net work\r\n");
}
}
}
树莓派读串口:
#include <wiringPi.h>
#include <wiringSerial.h>
#include <stdio.h>
int main()
{
int fd;
int cmd;
if(-1 == wiringPiSetup()){
printf("硬件初始化失败\n");
}
fd = serialOpen("/dev/ttyAMA0",9600);
while(1){
while(serialDataAvail(fd) != -1){
cmd = serialGetchar(fd);
printf("get data is %d\n",cmd);
}
}
return 0;
}
运行结果:
树莓派和PC串口交互:
#include <wiringPi.h>
#include <wiringSerial.h>
#include <stdio.h>
int main()
{
int fd;
int cmd;
if(-1 == wiringPiSetup()){
printf("硬件初始化失败\n");
}
fd = serialOpen("/dev/ttyAMA0",9600);
while(1){
while(serialDataAvail(fd) != -1){
cmd = serialGetchar(fd);
if(cmd == '2'){
serialPuts(fd,"Pi receive 2 from you!\r\n");
}
if(cmd == '3'){
serialPuts(fd,"Pi receive 3 from you!\r\n");
}
if(cmd == '4'){
serialPuts(fd,"Pi receive 4 from you!\r\n");
}
}
运行效果如下,拓展开来可以进行更多的硬件交互和控制:
语音模块
#include <stdio.h>
#include <string.h>
#include <wiringPi.h>
#include <wiringSerial.h>
#include <unistd.h>
#define SWITCH1 21
#define SWITCH2 22
#define SWITCH3 23
#define SWITCH4 24
int initwiringPiSetup()
{
int ret = wiringPiSetup();
if (ret == -1){
printf("init error\n");
return -1;
}
}
void initPin()
{
pinMode(SWITCH1,OUTPUT);//设置引脚为输出引脚
pinMode(SWITCH2,OUTPUT);//设置引脚为输出引脚
pinMode(SWITCH3,OUTPUT);//设置引脚为输出引脚
pinMode(SWITCH4,OUTPUT);//设置引脚为输出引脚
digitalWrite(SWITCH1,HIGH);
digitalWrite(SWITCH2,HIGH);
digitalWrite(SWITCH3,HIGH);
digitalWrite(SWITCH4,HIGH);
}
int main(){
int fd;
int n_read;
char cmd[128]={'\0'};
initwiringPiSetup();
initPin();
fd=serialOpen("/dev/ttyAMA0",9600);
while(1) {
n_read=read(fd,cmd,sizeof(cmd));
if(strlen(cmd)==0){
printf("waiting...\n");
continue;
}
if(strstr(cmd,"KYSD")!=NULL){ //字符串检索函数的使用技巧
digitalWrite(SWITCH1,LOW);
}
if (strstr(cmd,"GYSD")!=NULL){
digitalWrite(SWITCH1,HIGH);
}
if (strstr(cmd,"KCTD")!=NULL){
digitalWrite(SWITCH2,LOW);
}
if (strstr(cmd,"GCTD")!=NULL){
digitalWrite(SWITCH2,HIGH);
}
if (strstr(cmd,"KELD")!=NULL){
digitalWrite(SWITCH3,LOW);
}
if (strstr(cmd,"GELD")!=NULL){
digitalWrite(SWITCH3,HIGH);
}
memset(cmd,'\0',sizeof(cmd)/sizeof(char));
}
return 0;
}