通过shell脚本操作串口读和写

打算用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指令

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值