首先說明一下,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的電源都不要插在電腦上,否則串口會被占用,嗯,我插在了樹莓派上。
此時兩個板子的燈都會閃爍。
