連接兩個STM32單片機的串口引腳,單片機A進行發(fā)送,單片機B進行接收。單片機B根據(jù)接收到單片機A的指令來點亮或熄滅板載LED燈,通過實驗現(xiàn)象來驗證是否通訊成功。
二、實驗器材
兩套STM32F103C8T6單片機開發(fā)板、ST-Link下載器、杜邦線。
三、實驗步驟
3.1 配置單片機基本參數(shù)
使用STM32CubeIDE進行配置兩個單片機的時鐘信息、引腳狀態(tài)、串口信息、中斷等基本參數(shù)。兩單片機均采用串口1進行通訊,對應串口引腳均為PA9(發(fā)送引腳)、PA10(接收引腳);單片機B的GPIOC 13引腳設(shè)置為輸出狀態(tài),以控制開發(fā)板LED的亮滅。具體配置如下圖:
單片機A引腳配置信息
單片機B的引腳配置信息
串口配置信息
3.2 編寫代碼
計劃單片機B接收到單片機A發(fā)送的“1”后點亮LED,接收到單片機A發(fā)送的“2”后熄滅LED。現(xiàn)設(shè)計單片機A的主程序中循環(huán)發(fā)送“1”和“2”,期間間隔1s,故單片機主程序如下:
間隔1s循環(huán)發(fā)送“1”、“2”
單片機B采用中斷接收的方式,當接收到串口數(shù)據(jù)時進入接收中斷回調(diào)函數(shù)。在回調(diào)函數(shù)中判別接收到的數(shù)值,如果數(shù)值為1,則點亮LED,數(shù)值為2,則熄滅LED,其它數(shù)值則沒反應。編寫回調(diào)函數(shù)如下:
接收中斷回調(diào)函數(shù)
3.3 將程序進行編譯燒錄單片機,可點擊以下鏈接觀察實驗現(xiàn)象。
實驗視頻
業(yè)現(xiàn)場在使用觸摸屏的時候,與第三方控制器進行通信連接的時候,一般都是使用成熟的通信協(xié)議進行通信連接。而這些協(xié)議的實現(xiàn)過程,觸摸屏廠商也已經(jīng)在編程環(huán)境中進行了封裝集成,對于使用的工程師來說,通信的數(shù)據(jù)交換過程我們無需要關(guān)心。僅需要設(shè)置配置好控制器(PLC)的品牌,型號系列及基本的通信通道就可以了。當然,這是觸摸屏通信的常規(guī)使用方法,這里就使用自定義協(xié)議如何實現(xiàn)觸摸屏與控制器(如,單片機)的通信方法,分享給大家。以下通信測試方法除電腦外無需任何硬件,感興趣的話可以依照以下步驟還原測試過程。
在開始測試前,我們需要準備以下工具及軟件。
DOPSoft 2.00.07
Virtual Serial Port Driver
stc-isp-15xx-v6.86v
打開“Virtual Serial Port Driver”軟件,添加COM1、COM2兩個串口。添加完成后,如下所示;
打開串口助手軟件(stc-isp-15xx-v6.86v)。在串口助手的串口號中設(shè)置為COM1,9600,8,n,1。此處設(shè)置為COM1后,觸摸屏中就只能配置為COM2。其必須與虛擬串口設(shè)置的串口號對應。
到此,就完成了測試環(huán)境的搭建。以下開始觸摸屏部分的配置。
觸摸屏設(shè)置為本次測試的核心。
STEP1
打開“DOPSoft 2.00.07”軟件,并新建工程。
STEP2
在通信端口配置頁面,按照如下配置通信端口。這里以觸摸屏的COM2作為此處測試的連接端口,故需要將觸摸屏的COM2的“連接“復選框取消選中。這樣才可以將其用作自定義通信方式使用。
SETP3
在畫面編輯頁面,按照下圖所示,設(shè)置10個數(shù)值輸入框。并將其地址設(shè)置為觸摸屏內(nèi)部存儲區(qū)域的>在畫面編輯頁面,按照下圖所示,設(shè)置10個數(shù)值輸入框。并將其地址設(shè)置為觸摸屏內(nèi)部存儲區(qū)域的$0-$10。<-。
雙擊數(shù)值輸入框,彈出數(shù)值輸入框的配置對話框,如下所示。
在寫入地址對話框的后側(cè),點擊“…”,彈出輸入對話框。將連線名稱設(shè)置為內(nèi)部存儲區(qū)域(Internal Memory)。再將原件地址設(shè)置為“0”。
依照以上方法,將其他數(shù)值輸入框設(shè)置到地址1-10.
STEP4
設(shè)置畫面運行過程中的腳本程序。
選中畫面,在右側(cè)的屬性欄,選擇“畫面Cycle宏”。
彈出觸摸屏腳本編輯對話框,點擊下圖所示按鈕,打開腳本程序代碼編寫向?qū)υ捒颉?/p>
在腳本程序代碼編寫向?qū)υ捒蛑校x擇“命令”-“通信”-選擇命令。配置完成代碼參數(shù)后,選擇“更新宏”,完成代碼的添加。
代碼添加完成后,如下圖所示。
$M0=INITCOM(1, 0, 1, 0, 0, 6, 0)//初始化端口
SELECTCOM(1)//設(shè)置觸摸屏通信端口為2號端口
$M1=PUTCHARS(>$M1=PUTCHARS($0, 20, 3000)//發(fā)送觸摸屏內(nèi)部$0開始的20個連續(xù)地址數(shù)據(jù)<, 20, 3000)//發(fā)送觸摸屏內(nèi)部>$M1=PUTCHARS($0, 20, 3000)//發(fā)送觸摸屏內(nèi)部$0開始的20個連續(xù)地址數(shù)據(jù)<>
Delay(300)//延時
$M0=0//清除端口初始化標志
$M1=0//清除數(shù)據(jù)發(fā)送完成標志
CLEARCOMBUFFER(1, 1)//清除串口緩存
STEP5
啟動觸摸屏在線仿真。彈出如下所示的對話框,按照如圖所示的方式配置。
STEP6
按照地址,從上到下設(shè)置為1到10.
STEP7
打開串口助手,可以看到在串口助手的接收區(qū)域,已經(jīng)接收到觸摸屏在線仿真發(fā)送出來的數(shù)據(jù),且數(shù)據(jù)中可以看到有1到10(串口助手配置為16進制顯示模式,其中16進制的A即為十進制的10)。
STEP8
在觸摸屏在線仿真頁面,將第一個數(shù)據(jù)改為9999。
再次查看串口助手中接收到的數(shù)據(jù),其中第一個數(shù)據(jù)已經(jīng)變?yōu)?F 27.
為了驗證數(shù)據(jù)的正確性,打開電腦的計算器工具,將其設(shè)置為程序員模式。選擇16進制輸入模式。輸入0F27,可以看到轉(zhuǎn)換為十進制后數(shù)據(jù)為3879,這與觸摸屏輸入的數(shù)據(jù)9999無法對應。這是什么地方錯了嗎?其實不是。這只是數(shù)據(jù)的高低字節(jié)交換了,這在通信數(shù)據(jù)傳輸處理的時候需要特別注意。初次進行串口通信調(diào)試,很多都被這個給折騰過。
在計數(shù)器模式下,輸入270F。可以看到其轉(zhuǎn)換后的十進制數(shù)據(jù)為9999.與設(shè)置的輸入數(shù)據(jù)一致。
自此,使用觸摸屏進行串口自定義協(xié)議通信的測試就已經(jīng)完成。
(轉(zhuǎn)載請注明來源函控自動化工程師頭條號)
.下載 免費版 Visual Studio 2019 并進行安裝
visualstudio.microsoft.com/zh-hans/
2.雙擊軟件創(chuàng)建項目
3.選擇Windows窗體應用程序(.NET Framework)創(chuàng)建項目。
4.項目創(chuàng)建完成,初始界面。
5.選擇左側(cè)的工具欄,選擇 組件,然后雙擊 串口組件將串口添加進入項目。
6.點擊鼠標右鍵,修改串口模塊的屬性,包括 波特率等,本實驗采用默認。
7.雙擊串口模塊,添加數(shù)據(jù)接收中斷函數(shù)
8.添加按鈕模塊,控制STM32開發(fā)板LED燈的亮滅。
9.好的現(xiàn)在基本界面與模塊添加完成,開始寫程序,添加程序各種變量:
//串口通訊命令
public static byte[] SendOrder=new byte[3] { 0x5A,0x00, 0xA5 }; //中間為命令,頭尾為校驗 00 關(guān)燈 01開燈 02關(guān)蜂鳴器 03開蜂鳴器
// 串口接收
public static byte[] revcmd=new byte[3];
10. 開燈LED0程序如下:
private void button1_Click(object sender, EventArgs e) //開燈LED0
{
try
{
if (serialPort1.IsOpen)
{
serialPort1.Close();
}
serialPort1.Open(); //打開串口
serialPort1.DiscardInBuffer();//清空緩沖區(qū)數(shù)據(jù)
SendOrder[1]=0x01;//發(fā)送開燈命令
serialPort1.Write(SendOrder, 0, 3);//寫入串口緩沖區(qū)
}
catch
{
MessageBox.Show("請檢查串口1是否打開");
}
}
11.關(guān)燈LED0程序如下:
private void button2_Click(object sender, EventArgs e)
{
try
{
if (serialPort1.IsOpen)
{
serialPort1.Close();
}
serialPort1.Open(); //打開串口
serialPort1.DiscardInBuffer();//清空緩沖區(qū)數(shù)據(jù)
SendOrder[1]=0x00;//發(fā)送開燈命令
serialPort1.Write(SendOrder, 0, 3);//寫入串口緩沖區(qū)
}
catch
{
MessageBox.Show("請檢查串口1是否打開");
}
}
12.蜂鳴器程序留給大家寫,偷個懶(●'?'●)
13.串口接收函數(shù)如下:
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) //串口接收中斷
{
try
{
serialPort1.Read(revcmd, 0, 3); // 將接收緩沖區(qū)輸入revcmd
}
catch
{
MessageBox.Show("請檢查串口1是否打開");
}
this.Invoke(new EventHandler(ComService)); //調(diào)用事件處理函數(shù)
}
15.串口接收數(shù)據(jù)處理函數(shù)如下:
private void ComService(object sender, EventArgs e)
{
if ((revcmd[0]==0x5A) & (revcmd[1]==0x01) & (revcmd[2]==0xA5))
{
button5.Text="燈開了";
button5.BackColor=Color.FromArgb(255, 0, 0); //設(shè)置控件顏色為紅色
// button5.BackColor=Color.FromKnownColor(KnownColor.LightSeaGreen);; //設(shè)置控件顏色為
}
if ((revcmd[0]==0x5A) & (revcmd[1]==0x00) & (revcmd[2]==0xA5))
{
button5.Text="燈關(guān)了";
button5.BackColor=Color.FromArgb(224, 224, 224);//灰色
}
}
14.上位機程序編寫完成。附件如下:
VS2019_STM32串口通信.rar (41.29 KB, 下載次數(shù): 8)
(點擊閱讀原文內(nèi)下載)
15.下面開始寫STM32開發(fā)板程序,這個比較簡單,大家應該都會吧。(●'?'●)
void USART1_IRQHandler(void)//串口1中斷服務程序
{
u8 res;
USART1_StartFlag=1;
if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)
{
res=USART_ReceiveData(USART1); //讀接收到的字節(jié),同時相關(guān)標志自動清除
if(USART1_RX_CNT<100)
{
USART1_RX_BUFF[USART1_RX_CNT]=res;
USART1_RX_CNT++;
TIM_ClearITPendingBit(TIM7,TIM_IT_Update);//清除定時器溢出中斷
TIM_SetCounter(TIM7,0);//當接收到一個新的字節(jié),將定時器7復位為0,重新計時(相當于喂狗)
TIM_Cmd(TIM7,ENABLE);//開始計時
}
}
}
/////////////////////////////////////////////////////////////////////////////////////
//串口服務函數(shù)
void USART1RX_Service(void)
{
if(USART1_FrameFlag==1)
{
USART1_StartFlag=0;
USART1_FrameFlag=0; //復位幀結(jié)束標志
USART1_RX_CNT=0;//接收計數(shù)器清零
if((USART1_RX_BUFF[0]==0x5A)&&(USART1_RX_BUFF[1]==0x00)&&(USART1_RX_BUFF[2]==0xA5)) //通訊測試 5A 00 A5
{
SendBUF[0]=0x5A;
SendBUF[1]=0x00;
SendBUF[2]=0xA5;
LED0=1;
USART1_SendData(SendBUF,3);
}
if((USART1_RX_BUFF[0]==0x5A)&&(USART1_RX_BUFF[1]==0x01)&&(USART1_RX_BUFF[2]==0xA5)) //通訊測試 5A 00 A5
{
SendBUF[0]=0x5A;
SendBUF[1]=0x01;
SendBUF[2]=0xA5;
LED0=0;
USART1_SendData(SendBUF,3);
}
}
}
16.單片機程序直接附上:
VS2019_STM32通訊實驗.rar (2.43 MB, 下載次數(shù): 8)
(點擊閱讀原文內(nèi)下載)
17.下面進行配置電腦,由于水平有限,本程序需要設(shè)置電腦的COM口且需要改為COM1如下圖:
或者更改VS2019中串口模塊的屬性,如下:
18.好的完成了,謝謝大家。