最近项目需要,需要用485去采集传感器信号,然后给信号传至服务器。板子上网采用4G。由于没有能力去设计板子(就算设计出来,加工费也挺贵),因此考虑去某多多上找一个带4G功能,带485的板子,自己写一下程序。输入关键字4G ,485,下面这个板子就出来了。
这个板子看起来挺好,还是宽电压输入5到24V输入,刚好传感器是12V。怎么看这板子怎么合适。果断下单,40块还挺贵。
板子拿到以后,联系商家要资料,商家给了合宙官网 简介 - @air780e - 合宙模组资料中心,以及一个板子电路图,如下
按资料的说法,板子上的STM32芯片,只是一个透传功能,实际按商家给的给的AT指令测试,发现确实可以通过485给AIR780E发生发送AT指令,也可以收到AIR780E返回的结果。见下图。
有了这个前提,似乎是修改一下AIR780E里面的代码,就行了。好像是很简单的一件事。AIR780E.cn上给的资料很全,demo也很全。先从串口收发开始,就是停向485发送数据,接受数据,然后输出。代码:
local uartid = 1 -- 根据实际设备选取不同的uartid
--初始化
uart.setup(
uartid,--串口id
115200,--波特率
8,--数据位
1--停止位
)
-- 收取数据会触发回调, 这里的"receive" 是固定值
uart.on(uartid, "receive", function(id, len)
local s = ""
repeat
s = uart.read(id, 128)
if #s > 0 then -- #s 是取字符串的长度
-- 关于收发hex值,请查阅 https://doc.openluat.com/article/583
log.info("uart", "receive", id, #s, s)
-- log.info("uart", "receive", id, #s, s:toHex()) --如果传输二进制/十六进制数据, 部分字符不可见, 不代表没收到
end
until s == ""
end)
sys.taskInit(function()
-- 循环两秒向串口发一次数据
while true do
sys.wait(2000)
uart.write(uartid, "111111")
end
end)
-- 用户代码已结束---------------------------------------------
sys.run()
-- sys.run()之后后面不要加任何语句!!!!!
代码比较简单,直接下载到板子,运行。发现数据收不到了。百思不得其解,到底哪里出了问题?
联系商家以后,商家给的答案是,他也不知道。推测,STM32芯片里面,串口透传,只透传AT指令,其他直接给过滤了。所以还得给STM32重新写一个程序,用来透传AIR780E和485。
这就头大了,那就写呗,按道理就是两个串口互传,也不是很难。代码写好,使用下载器下载到STM32,上电,运行,发现依然不管用,一度怀疑我STM32的代码写的有问题,就不停的修改修改再修改,最后还是不行。一脸懵逼的我,一直一脸懵逼。问商家要STM32的示例代码,商家也没有。后来查看了一下板子上485芯片型号,SP3485EEN,搜索资料发现,这个芯片是一个半双工芯片,需要用一个针脚来控制芯片方向。见下图:
顿时明白了,为啥一直收不到数据,这是需要用阵脚控制方向才行。又仔细看了一下板子的电路图,发现STM32上面PA1是控制方向用的。使用这个阵脚,输出高电压,就可以对485发送数据。找到问题所在,解决起来就简单了。于是改代码,下载。
突然STM下载器找不到芯片了,在最后关头,STM芯片坏了。。。。。。可能原因是,下载器3.3v供电,和4855V供电同时加上,导致STM32芯片坏了。最尴尬的事情摸过如此。
不过没关系,这个STM32芯片只是一个透传芯片,也就是说这个STM32,就是放屁脱裤子,多余的。
经过仔细看电路图(见下图),AIR780E的串口是可以直接可以SP3485芯片链接的。R13,R15,R17,是接到STM32的三个0欧电阻(实际就是一个方便断开的条线),接到AIR780E上的R12,R14,R16是断开的。只需要将下三个0欧电阻拆掉,放到上面,就行了。这样就跳过STM32了,这样做唯一的缺点就是,花钱买的STM芯片,结果就是一个摆设。
电路图对应的实际板子布局如下,右侧是接到STM32的三个0欧电阻。左侧是断开的,到AIR780E。将0欧电阻转移一下位置就行了。
修改后的板子如下图,下面两个0欧电阻,不小心掉了一个,但是不影响,因为这两个也是接到STM32的,芯片已经坏掉了,拆不拆都不影响。如果STM32不坏的话,应该是要拆掉比较好。
板子改造完毕以后,接下来就简单多了,没有中间商赚差价,直接通信就了。当然还是要用阵脚控制485芯片的方向的。如下图,AIR780E芯片上控制方向的阵脚是MAIN_DTR,图上标的是19。
local uartMode=gpio.setup(19, 1) ---阵脚19是控制串口方向的
每次发送数据之前,都需要将MAIN_DTR拉高,发送完毕再复位
--统一的串口发送数据-----------------------------------
function send(data)
log.info("uart send data",data)
uartMode(1) --发送之前拉高
sys.wait(5) --等待
uart.write(uartid,data)
sys.wait(5) --等待
uartMode(0) --发送后复位
log.info("uart send data over")
end
下载代码,运行。满心期待通信没有问题了。结果,板子能收到电脑发的数据,电脑收不到板子发来的数据。这可能的原因1:转移0欧电阻的时候,没有焊接牢固。2:方向阵脚无效。
既然是0欧电阻,实际上是可有可无的,于是就给几个0欧电阻全部去掉了,直接用锡短接。排除电路问题以后,发现依然没有解决问题。那就只可能是main_dtr这个阵脚的问题了。
百度搜索AIR780E的GPIO阵脚,发现MAIN_DTR引出的阵脚序号是19,实际上是GPIO22。
这个阵脚序号和GPIO序号不对应是普遍现象。
最终修改阵脚为22,解决问题。
local uartMode=gpio.setup(22, 1) ---阵脚22是控制串口方向的
PC与AIR780E通过串口通信成功。见下图:
由于项目还在进行中,完整代码稍后一段时间分享。