Part5_Arduino接收ATF模块消息
<p>[TOC]</p>
<h1>功能描述</h1>
<p>本例程将演示如何通过编程让arduino系统接收ATF模块主动发出的串口消息字符串,分析处理所接收的消息字符串后,将分析结果利用字符串,显示于界面当中的一个字符串控件。</p>
<h4>接线方法</h4>
<p>将彩屏和Arduino控制器进行连接,RX-TX,GND-GND(用到了RX和TX串口)</p>
<h4>实现功能</h4>
<p>本例将在part4示例的资源文件基础上进行修改。
将part4中的打印区删除后,添加一个字符串控件,用于arduino系统分析后,发送指令将相关信息以字符串的形式显示在字符串控件中。
编写下方代码并上传至arduino系统,点击按键,程序分析ATF模块消息并发送字符串显示指令给ATF模块,字符串控件显示信息。</p>
<h4>操作示例</h4>
<p>1.打开part4的资源文件,在【工程信息】——【基本配置】中,将字符串屏打印功能关闭。
2.切换到索引号为0的界面进行编辑,打开【界面指令】,选中字符串直接打印配置指令,点击删除。
如图:
<img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=a86344904435f41ae6e588d456ddfa0c&amp;file=file.png" alt="" />
3.切换到界面控件,添加一个字符串控件。用户可通过控制器向该控件写入字符串数据,控件可将收到的字符串数据打印出来。本次演示中,arduino系统的程序接受并分析ATF模块主动发出的消息字符串然后将相关信息以字符串的形式显示在此控件中。
操作如图:
<img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=07255fc5b9637f51d23ba0de2b9f8cae&amp;file=file.png" alt="" />
用户可根据需求配置控件,具体可查看相应模块的技术详解文档进行了解,本例程控件配置如下图:
<img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=c81804430c3ca1fe256eb934d220ab9c&amp;file=file.png" alt="" /></p>
<h1>使用代码</h1>
<p>本次提供两种代码,分别为串口接收和软串口接收彩屏数据。
说明:目前发现官方UNO,2560的USB转串口芯片会影响D0和D1的串口信号通讯。
使用这种主板的用户,可以使用软串口。
例程就是为大家提供软串口通讯的案例。
备注:软串口用户可以自行定义。例程中使用的是D2和D3</p>
<h4>1.串口</h4>
<pre><code class="language-c">void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
Serial.setTimeout(20);
}
unsigned char m_ReciverHeader; //ATF Message Header char = @/#/$
unsigned short m_ReciverBodyID; //ATF Message BodyID 0:GUI Swtich 100~65535:Body Msg
int m_ReciverVarInt; //ATF Message int Val(Header=@)
float m_ReciverVarFloat; //ATF Message float Val(Header=#)
String m_ReciverVarString; //ATF Message String Val(Header=$)
void loop() {
// put your main code here, to run repeatedly:
if(ATFMessageService(2))
{
if(m_ReciverBodyID==0)
{
Serial.print(&quot;@SET 104,&quot;);
Serial.print(&quot;GUISwitch to&quot;);
Serial.println(m_ReciverVarInt);
}
else if(m_ReciverBodyID&gt;=100)
{
Serial.print(&quot;@SET 104,&quot;);
Serial.print(&quot;Body:&quot;);
Serial.print(m_ReciverBodyID);
Serial.print(&quot; Message &quot;);
if(m_ReciverVarInt==1)
{
Serial.println(&quot;Release&quot;);
}
else
{
Serial.println(&quot;Push&quot;);
}
}
}
}
unsigned char ATFMessageService(unsigned char delaytimer)
{
char n_TempChar;
n_TempChar = Serial.available();
if(n_TempChar)
{
delay(delaytimer);
n_TempChar = Serial.read();
while(n_TempChar!='@'&amp;&amp;n_TempChar!='#'&amp;&amp;n_TempChar!='$'&amp;&amp;n_TempChar&gt;=0)
{
n_TempChar = Serial.read();
}
m_ReciverHeader = n_TempChar;
m_ReciverBodyID = Serial.parseInt();
if(n_TempChar=='@')
{
m_ReciverVarInt = Serial.parseInt();
}
else if(n_TempChar=='#')
{
m_ReciverVarFloat = Serial.parseFloat();
}
else if(n_TempChar=='$')
{
Serial.read();
m_ReciverVarString = Serial.readStringUntil('\r');
}
else return 0;
return 1;
}
return 0;
}</code></pre>
<h4>2.软串口</h4>
<pre><code class="language-c">#include &lt;SoftwareSerial.h&gt;
SoftwareSerial Port1(3,2); //控制器D2口,接彩屏的RX接收端;控制器D3口,接彩屏的TX接收端
void setup() {
Port1.begin(9600); //软串口的波特率
Port1.setTimeout(20); //设置设备等待串口数据的最大时间间隔。单位毫秒。
}
unsigned char m_ReciverHeader; //彩屏发来数据的头字符 Header char = @/#/$
unsigned short m_ReciverBodyID; //彩屏发来数据的控件名称字符 BodyID = 0:界面GUI Swtich Body ID = 100~65535:控件ID号 Body Msg
int m_ReciverVarInt; //彩屏控件数据整形: int Val(Header=@)
float m_ReciverVarFloat; //彩屏控件数据浮点数: float Val(Header=#)
String m_ReciverVarString; //彩屏控件数据字符串:String Val(Header=$)
void loop() {
if(ATFMessageService(2))
{
if(m_ReciverBodyID==0) //界面数据
{
Port1.print(&quot;@SET 104,&quot;);
Port1.print(&quot;GUISwitch to&quot;);
Port1.println(m_ReciverVarInt);
}
else if(m_ReciverBodyID&gt;=100) //控件数据
{
Port1.print(&quot;@SET 104,&quot;);
Port1.print(&quot;Body:&quot;);
Port1.print(m_ReciverBodyID);
Port1.print(&quot; Message &quot;);
if(m_ReciverVarInt==1)
{
Port1.println(&quot;Release&quot;);
}
else
{
Port1.println(&quot;Push&quot;);
}
}
}
}
unsigned char ATFMessageService(unsigned char delaytimer) //串行数据接收子函数
{
char n_TempChar;
n_TempChar = Port1.available();
if(n_TempChar)
{
delay(delaytimer);
n_TempChar = Port1.read();
while(n_TempChar!='@'&amp;&amp;n_TempChar!='#'&amp;&amp;n_TempChar!='$'&amp;&amp;n_TempChar&gt;=0)
{
n_TempChar = Port1.read();
}
m_ReciverHeader = n_TempChar;
m_ReciverBodyID = Port1.parseInt();
if(n_TempChar=='@')
{
m_ReciverVarInt = Port1.parseInt();
}
else if(n_TempChar=='#')
{
m_ReciverVarFloat = Port1.parseFloat();
}
else if(n_TempChar=='$')
{
Port1.read();
m_ReciverVarString = Port1.readStringUntil('\r');
}
else return 0;
return 1;
}
return 0;
}</code></pre>
<h1>资源文件</h1>
<p><a href="https://pan.baidu.com/e/1hchf6ssrJy3sSmvhbgDmoQ?pwd=ATFC">高级篇part5_资源文件</a></p>
<h1>视频教程</h1>
<p><a href="https://www.bilibili.com/video/BV17u411i7Qb/?spm_id_from=333.999.0.0&amp;vd_source=8adc070117854dc6967b17bf3379321b">【高级篇】Part5_Arduino接收ATF模块消息</a></p>