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