流程图
1--------
【状态A机器】
原始树莓派 它只有AMA0使能 ls -l /dev | grep tty
它是UART0 是硬件串口 是AMA0 是给蓝牙用的
lrwxrwxrwx 1 root root 7 Jan 28 01:33 serial1 -> ttyAMA0
此时用户没有UART可以使用
2--------
【状态B机器】
随后在config.txt 追加了一句 enable_uart=1
它是使能了迷你串口 它是 UART1 默认是给无头模式登入的 并且cmdline.txt可以修改波特率
enable_uart=1 //从只有 serial1 -> ttyAMA0 到serial0 -> ttyS0 和 serial1 ->ttyAMA0
#dtoverlay=disable-bt //(硬件串口与mini串口默认映射对换 这里没有做 无视)
ls -l /dev | grep tty
现在是
lrwxrwxrwx 1 root root 5 Mar 11 06:38 serial0 -> ttyS0
lrwxrwxrwx 1 root root 7 Mar 11 06:38 serial1 -> ttyAMA0
验证无头模式很好用
下图的3根线可以无头进入!
3---------
【状态C机器】
现在维持AMA0给蓝牙使用
S0不要做无头模式的 怎么失能?
sudo systemctl stop serial-getty@ttyAMA0.service
sudo systemctl disable serial-getty@ttyAMA0.service
B
sudo systemctl stop serial-getty@ttyS0.service
sudo systemctl disable serial-getty@ttyS0.service
sudo systemctl start serial-getty@ttyS0.service
sudo systemctl enable serial-getty@ttyS0.service
sudo systemctl status serial-getty@ttyS0.service
A
cmdline.txt 删除console=serial0,115200
原始
root@raspberrypi:~# cat /boot/cmdline.txt
console=serial0,115200 console=tty1 root=PARTUUID=c86f8f6e-02 rootfstype=ext4 fsck.repair=yes rootwait
修改为
console=tty1 root=PARTUUID=c86f8f6e-02 rootfstype=ext4 fsck.repair=yes rootwait
4--
写一个程序XCOM发什么 PI就返回什么!发送1就是关闭
状态A机器
没有使能无头模式 会失败 设备无法打开
直接用AMA0 会失败 识别打开 但是无法通讯 TXRX接的是无头模式的3根线
状态B机器
使能无头模式 成功 设备打开 WIN10输入4 收到4 但是有时候会有干扰
怎么把cmdline使能呢?
状态C机器
和上面一样 也即是A不可以
完成B以后很好!!!!
5--变化S0也就是 UART1 的PIN脚
不知道 问淘宝
6--交换一下S0 AMA0
A 在追加的 enable_uart=1 下面追加依据 dtoverlay=disable-bt
B 维持cmdline.txt的del
C 执行 sudo systemctl disable hciuart
sudo systemctl status hciuart
一切正常
复位 再看
变化1 hciconfig 没有了
变化2 交换了
lrwxrwxrwx 1 root root 7 Mar 11 07:59 serial0 -> ttyAMA0
lrwxrwxrwx 1 root root 5 Mar 11 07:59 serial1 -> ttyS0
此时代码不能直接run 需要修改了
#define UART "/dev/ttyAMA0"
//#define UART "/dev/ttyS0"
可以了 一样很稳定
理论是更加稳定!!!!!
一共6个 新增加的4个很好用 传统的2个 硬 分给蓝牙 迷你可以自己拿出来用 也就是5个开发的
#include <wiringSerial.h>
#include <wiringPi.h>
#include <stdio.h>
#define UART "/dev/ttyAMA0"
//#define UART "/dev/ttyS0"
int main()
{
int fd;
unsigned char cmd;
wiringPiSetup(); //树莓派初始化
fd = serialOpen(UART,9600);// 打开串口 返回文件描述符fd ;
// /dev/ttyAMA0 : 串口的地址,在Linux中就是设备所在的目录
// 9600:波特率
// 返回:正常返回文件描述符,否则返回-1失败。
if(fd < 0){
printf("Unable to open serial device\n") ;
return 1 ;
}
printf("uart test [%s]\n",UART); // 终端打印
serialPrintf(fd, "Hello World!\r\n"); // 串口打印
while(1){
while(serialDataAvail(fd) != -1){ //serialDataAvail(fd):获取串口缓存中可用的字节数。
//返回:串口缓存中已经接收的,可读取的字节数,-1代表错误
cmd = serialGetchar(fd); //从串口读取一个字节数据返回给 cmd
printf("get-cmd == %d \n",cmd);
if(cmd == 1){
serialPrintf(fd, "\r\nserial close\r\n\r\n"); // 串口打印
serialClose(fd); // 关闭串口
return 0;
}else {
//serialPuts(fd,"HELLO\r\n");
serialPutchar(fd,cmd); // 通过串口发送字节
}
}
}
return 0;
}