新手入门
- 积分
- 18
- 金钱
- 18
- 注册时间
- 2024-1-3
- 在线时间
- 2 小时
|
1金钱
波特率为115200,
使用printf函数发送数据给上位机,
Edit里Configuration的数据格式设置为中文简体,
按下按键key0通过串口usart1使用printf函数发送一次数据给上位机,有时正常有时乱码,
查了很多资料和网站帖子,也尝试着修改代码,但是一直没找到原因。
代码如下:
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "key.h"
#include "usmart.h"
#include "can.h"
/************************************************
ALIENTEK 战舰STM32F103开发板 实验26
CAN实验-HAL库函数版
技术支持:www.openedv.com
淘宝店铺: http://eboard.taobao.com
关注微信公众平台微信号:"正点原子",免费获取STM32资料。
广州市星翼电子科技有限公司
作者:正点原子 @ALIENTEK
************************************************/
int main(void)
{
extern CAN_RxHeaderTypeDef RxHeader;
u8 key;
u8 i=0,t=0;
u8 cnt=0;
u8 canbuf[8];
u8 res;
u8 mode=1;
HAL_Init(); //初始化HAL库
Stm32_Clock_Init(RCC_PLL_MUL9); //设置时钟,72M
delay_init(72); //初始化延时函数
uart_init(115200); //初始化串口
usmart_dev.init(84); //初始化USMART
LED_Init(); //初始化LED
KEY_Init(); //初始化按键
CAN1_Mode_Init(CAN_SJW_1TQ,CAN_BS2_8TQ,CAN_BS1_9TQ,4,CAN_MODE_LOOPBACK); //CAN初始化,波特率500Kbps
CAN_Config();
while(1)
{
key=KEY_Scan(0);
if(key==KEY0_PRES)//KEY0按下,发送一次数据
{
printf("\r\n\r\n发送的CAN报文数据为:"); //显示数据
for(i=0;i<8;i++)
{
canbuf=cnt+i;//填充发送缓冲区
printf(" %02X",canbuf); //显示数据
}
res=CAN1_Send_Msg(canbuf,8);//发送8个字节
if(res)printf("发送失败\r\n"); //提示发送失败
else printf("\r\n发送成功"); //提示发送成功
}else if(key==WKUP_PRES)//WK_UP按下,改变CAN的工作模式
{
mode=!mode;
if(mode==0) CAN1_Mode_Init(CAN_SJW_1TQ,CAN_BS2_8TQ,CAN_BS1_9TQ,4,CAN_MODE_NORMAL); //回环模式,波特率500Kbps
else if(mode==1) CAN1_Mode_Init(CAN_SJW_1TQ,CAN_BS2_8TQ,CAN_BS1_9TQ,4,CAN_MODE_LOOPBACK); //回环模式,波特率500Kbps
CAN_Config();
if(mode==0)//普通模式,需要2个开发板
{
printf("\r\n\r\n普通模式");
}else //回环模式,一个开发板就可以测试了.
{
printf("\r\n\r\n回环模式");
}
}
key=CAN1_Receive_Msg(canbuf);
if(key < 9)//接收到有数据
{
printf("\r\接收到的CAN报文ID为:0x%03X",RxHeader.StdId);//主要是这句和下面一句乱码
printf("\r\n接收到的CAN报文数据为:"); //显示数据
for(i=0;i<key;i++)
{
printf(" %02X",canbuf); //显示数据 //显示数据
}
}
t++;
delay_ms(10);
if(t==20)
{
LED0=!LED0;//提示系统正在运行
t=0;
cnt++;
}
}
}
|
|