STM32與Arduino串口通信實驗


首先說明一下,arduino使用的編碼方式是utf8,因此stm32的編碼方式也要使用utf8才能發送漢字成功。
然后再說明一下,stm32的串口接收協議里需要接收的數據以0x0d和0x0a結尾,即末尾時\r\n,而arduino的串口協議不需要任何結尾。
stm32的編碼方式設置方式為:configuration(小扳手)-> editor -> encoding -> encode in utf-8 without signature
因此為了避免格式錯亂,推薦使用英文進行發送!
這里直接演示發送字符串的方式,同理發送字符就是一個字母或數字而已。

一、arduino發送字符串,stm32接收字符串

實驗效果為:arduino發送一次數據,燈閃一次;stm32沒收到“你好”時,LED2閃爍,收到“你好”時,LED1閃爍,LED2不再閃爍。

1.1 arduino源碼

void setup() {
	Serial.begin(9600);
	pinMode(13,OUTPUT);
}

void loop() {
	digitalWrite(13,LOW);
	delay(500);
	Serial.print("你好\r\n");
	digitalWrite(13,HIGH);
	delay(500);
}

注意:stm32是使用了我自建的庫函數,是德飛萊尼莫stm32的程序。

1.2 stm32源碼

#include "imut_advance.h"

void SysInit()
{
	delay_init();                       		                        
	LEDInit(0);LEDInit(1);            	                                                          
}



int main(void)
{		
 	char t;  
	u16 len;	
	u8 lalal[]="你好";
	u8 mark=0;

	delay_init();	    	   	 
	LEDInit(2);LEDInit(3); 
	uart_init(9600);

	NVICInit(2,0,USART1_IRQn,2);

 	while(1)
	{
		if(USART_RX_STA&0x8000)
		{					   
			len=USART_RX_STA&0x3fff;
			for(t=0;t<len;t++)
			{
				if(USART_RX_BUF[t]==lalal[t])mark=1;
				else {mark=0;break;}			
				while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
			}
			if(mark==1)
			{
				while(1)
				{
					LED3=!LED3;
					delay_ms(500);
				}
			}
			USART_RX_STA=0;
		}	 		
		LED2=!LED2;
		delay_ms(500);	
	}
}

二、stm32發送字符串,arduino接收字符串

實驗效果為:stm32發送完字符串LED2閃爍,arduino接收到字符串時燈閃爍。

arduino源碼

char compare[] = "你好";
char comdata[] = "";//字符串函數
int mark;
void setup()
{
  Serial.begin(9600);
  pinMode(13,OUTPUT);
  }
void loop()
{
  if(Serial.available())
  {
      String comdata = "";//緩存清零
      while (Serial.available() > 0)//循環串口是否有數據
      {
        comdata += char(Serial.read());//疊加數據到comdata
        delay(2);//延時等待響應
      } 
      int i=0;
      int t;
      for (t=0;t<comdata.length() ;t++)
      {
        if(comdata[i]==compare[i])mark=1;
        else{mark=0;break;}
        i++;
      }

   }
   if(mark==1)
  {
      digitalWrite(13,HIGH);
      delay(500);
      digitalWrite(13,LOW);
      delay(500);
   } 
}

二、STM32程序

#include "imut_advance.h"

int main()
{
	delay_init();                       		                        
	LEDInit(2);LEDInit(3);            		                          
	KeyInit(0);KeyInit(1);KeyInit(2); 		                          
	USARTInit(1,9600);                		                        
    NVICInit(2,0,USART1_IRQn,2); 
	while(1)
	{	
		LED2=!LED2;
		printf("你好");
		delay_ms(500);
	}
}

三、接線方式

拔掉STM32PA9和PA10的跳冒,

STM32 Ardino
PA9 0
PA10 1

重點來了,STM32和Arduino的電源都不要插在電腦上,否則串口會被占用,嗯,我插在了樹莓派上。

此時兩個板子的燈都會閃爍。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM