流程图 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;
}
|