目录
串口,芯片,转换器,设备之间的通讯的接线,都是要TX--RX, RX--TX 交叉连接。
单片机串口和电脑不能直接通讯,要经过USB转换,
最直接的方式:
单片机串口引脚---ttl/cmos转USB---电脑USB口
经过485或者232的方式:
单片机开发板(单片机串口引脚 -- 485芯片引脚)485接口 -- 485转USB -- 电脑USB
单片机串口通常要经过max485或者max3232芯片,转换成485或者232信号(应该是这样的信号更不容易受干扰,等等),去和其他设备进行通讯。 485或者232信号在工作的时候直接和其他设备连接即可,在调试或者其他需要和电脑连接的时候,通过485转USB(232转USB)和电脑通讯。
1.串口输出数据到电脑
硬件部分
串口--串口转USB--电脑USB口
单片机串口和转换器接线:
单片机 -- TTL/CMOS转USB
VDD -- VDD
TX -- RX
RX -- TX
GND -- GND
电脑USB接口供电是5V, 转换器有5v和3.3v可选择,根据单片机电源确定。
如果只需要单片机发送数据,只需要连接单片机的TX GND的和转换器的RX GND即可,只要接收数据,也是两根线就可以。
有时候,JLINK调试器也连接着单片机,转换器的gnd不接线也可以,可以共用jlink的gnd。
单片机有电源时,VDD--VDD接不接都可以。
单片机的gnd和电脑的gnd连接,电脑可以正常接收,断开共地,只有一个TX--RX连接,电脑接受的是乱码
下图:接线正常,接受正常;断开gnd,接受的是乱码;重新连接gnd,接收正常Hello
串口输出数据到电脑的软件软件部分:
串口助手:sscom (接收printf打印的数据)
调试环境:keil
我使用了microlib+重定向printf,有不使用microlib的方式以后再试了。
keil的target设置:
芯片:stm32c031系列,
库文件是HAL库,标准库的方式没试。
重定向printf的程序,将这一段插入到main.c文件或者建一个新.c文件放置都可以
#include "stdio.h"
/*重定向printf函数*/
int fputc(int ch, FILE *f)
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1 , 0xffff);
return ch;
}
在主循环里加入以下语句即可:
while (1)
{
printf("hello\n");
HAL_Delay(delay_time);//避免发送太快,延时一下
}
相关问题:
1.死机问题 卡死在这里: 0x0800054A BEAB BKPT 0xAB0
解决方式:勾选微库就行了
- printf是把输出重定向到串口,由串口把信息输出到电脑,由串口助手显示出来。
还有模拟调试的时候,可以把printf的内容输出到 keil的"debug (printf) viewer" (或者USART #)窗口,没有试过,不知道实际是不是这样。以前试过一次,但是keil没有那个芯片的模拟功能。
//这一段没用到,放这里参考一下
#include "stdio.h"//printf的头文件
//#include "usart.h"//我的串口配置在usart.c文件里,包括变量huart1
/**********************************************************
本来想使用一下这段适配不同情况,但是没搞好,就不搞了,先放在这里
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#else
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#endif
int fputc(int ch, FILE *f)
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1 , 0xffff);
return ch;
}
**************************************************************/
/*重定向printf函数*/
int fputc(int ch, FILE *f)
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1 , 0xffff);
return ch;
}
/************************************************************
不知道怎么用,找资料的时候看到的,先放在这
/*接收数据*/
int GetKey(void)
{
uint8_t received_data;
// 轮询方式接收数据,超时为 HAL_MAX_DELAY,表示无限等待
HAL_UART_Receive(&huart1, &received_data, 1, HAL_MAX_DELAY);
return (int)received_data;
}
*****************************************************************/
2.单片机串口--485--485转USB--电脑
单片机 -- 485 接线
USART->CK -- 485->RE(头上有横线和485->DE)
USART->TX -- 485->DI
USART->RX -- 485->RO
MAX485引脚图:
RO:Receiver Output
DI:Driver Input
RE、DE:Receiver Output Enable Driver Output Enable