打算用shell脚本来操作串口控制esp32c3开发板
centos系统,网上了解到linux开发环境下有个名为minicom的软件,安装后手动输入AT指令,虽然可以正常调试,但是手动输入毕竟不太方便,想着能不能写个shell脚本,自动向串口发送AT指令。
echo 和 printf 都可以向串口发送数据(例如 printf "AT\r\n" > /dev/ttyACM1),在这里我感觉用printf比较方便
之前我用esp-at开发环境自定义了1条AT指令:AT+LED=pin_num,1/0
比如LED连接在GPIO12这个引脚,只要发送 printf "AT+LED=12,1\r\n" > /dev/ttyACM1 就可以点亮LED
在minicom软件打开的状态下,我在命令行输入上述AT指令是完全没问题的
但是后来发现,在关闭minicom软件的情况下,在命令行输入上述AT指令不能正常点亮LED,所以我就想在命令行读取串口数据,网上多数教程是使用 cat /dev/ttyACM1 这条命令,也有教程强调:使用cat来读取串口数据会一直停在那里,需要另外先通过stty命令设置终端参数:
stty -F /dev/ttyACM1 raw speed 115200 min 0 time 10
但是我在使用中发现即便加了这条命令,有时cat /dev/ttyACM1会不停读取到^M等类似符号,我的判断是可能stty配置的某些参数不正确。联想到在打开minicom软件的状态下是不存在刚才这些问题的,我就想:那就每次运行shell脚本之前先在后台运行一次minicom,比如:
nohup minicom -D /dev/ttyACM1 &
这样再去读取和写入串口。经过多次测试,基本可行。shell脚本如下
#!/bin/bash
# Program:
# minicom test
# History:
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~bin
export PATH
DEV=/dev/ttyACM1
nohup minicom -D $DEV &
sudo stty -F ${DEV} speed 115200 min 0 time 10
a=1
function myatconfig()
{
value="Begin"
while [ "$value" != "OK" ]; do
rm -f mylog
while [ ! -s mylog ]; do
printf $1 > $DEV
cat $DEV > mylog
let a++
printf "$a\n"
if [ $a -gt 10 ]; then
a=1
break
fi
done
cat mylog
value=$(tail -n1 mylog |cut -c 1-2)
let a++
if [ $a -gt 10 ]; then
exit
fi
done
}
c_config="AT+MQTTCONN?\r\n"
step0="AT+MQTTCLEAN=0\r\n"
step1="AT+MQTTUSERCFG=0,1,\"ESP32C3\",\"admin\",\"123456\",0,0,\"\"\r\n"
step2="AT+MQTTCONN=0,\"192.168.31.245\",1883,0\r\n"
printf "$c_config" > $DEV
cat $DEV > mylog
cat mylog
grep '^+' mylog |cut -d ',' -f 2
value=$(grep '^+' mylog |cut -d ',' -f 2)
if [ "$value" == "4" ] || [ "$value" == "5" ] || [ "$value" == "6" ]; then
myatconfig $step0
fi
myatconfig $step1
myatconfig $step2
目的是为了熟悉shell脚本的编写以及MQTT指令。作为记录备忘
每一条AT指令返回OK后再继续执行下一条AT指令