首先说明一下,arduino使用的编码方式是utf8,因此stm32的编码方式也要使用utf8才能发送汉字成功。
然后再说明一下,stm32的串口接收协议里需要接收的数据以0x0d和0x0a结尾,即末尾时\r\n,而arduino的串口协议不需要任何结尾。
stm32的编码方式设置方式为:configuration(小扳手)-> editor -> encoding -> encode in utf-8 without signature
因此为了避免格式错乱,推荐使用英文进行发送!
这里直接演示发送字符串的方式,同理发送字符就是一个字母或数字而已。
实验效果为:arduino发送一次数据,灯闪一次;stm32没收到“你好”时,LED2闪烁,收到“你好”时,LED1闪烁,LED2不再闪烁。
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的程序。
#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发送完字符串LED2闪烁,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);
}
}
#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的电源都不要插在电脑上,否则串口会被占用,嗯,我插在了树莓派上。
此时两个板子的灯都会闪烁。
原文:https://www.cnblogs.com/chendeqiang/p/12861628.html