背景介绍
串行通讯是指仅用一根接收线和一根发送线就能将数据以位进行传输的一种通讯方式,典型的串口通信使用3根线完成,分别是地线(GND)、发送(TX)、接收(RX)。
本篇文章会告诉你如何使用GDK3进行串口通信,并查看接收的数据。
所需设备:
1个GDK3
3根杜邦线
1根USB线(一端为Type-C,另一端为Type-A)
1个USB转TTL设备(需要额外购买,推荐芯片:CH340G)
1. 安装MobaXterm
下载链接:https://mobaxterm.mobatek.net/download.html
2. 安装CH340G芯片的驱动程序
前往沁恒官网下载CH340G芯片的驱动程序。如果您使用的是其他芯片,则需要到对应品牌的官网下载对应芯片型号的驱动程序。
下载链接:https://www.wch.cn/download/CH341SER_EXE.html
3. 连接设备
连接设备时最重要的的就是管脚间的连接;GDK3与USB2TTL连接时,管脚连接的方式应该是:TX与RX交叉连接,GND互相连接。
TX与RX交叉连接的原因很简单,发送方要有一个接收方,才能完成一次数据传输的流程,如果是TX接TX,RX接RX,那就成TX那边是双方擂台对战,RX那边则是望眼欲穿,等待TX回来,
GND一定要接好,避免数据乱码。
RX - TX
TX - RX
GND - GND
GDK3的TX、RX、GND管脚可以在下图的右上方看到。
USB2TTL的TX、RX、GND管脚可以在下图的左下角看到。
设备的连接示意图如下所示:
杜邦线复制连接管脚:RX - TX, TX - RX,GND -GND
USB线的Type-C端连接到GDK3的USB2端口上。
最后把USB2TTL的USB端和USB线的Type-A端插入电脑的USB端口内。
4. 设置MobaXterm
打开MobaXterm,点击Session,选择Serial,然后选择USB2TTL设备所在端口,设置波特率为115200,最后点击OK即可。
5. 查看输出
进入串口会话查看输出。
Printf
如果在项目中直接使用printf,那你大概率在串口输出的消息里面看不到打印的内容了,这是因为CH32F10x中,想要把信息打印到串口,需要借助fputc的帮助,但在gdk3SDK中,printf并没有重定向到fputc。
printf重定向的方法无非三类:
- Keil MDK:勾选 MacroLib
- Keil MDK:定义下方代码,使得调用 printf 自动调用 fputc
- 使用HAL库,重写_write函数。
下方的代码是在 gdk3SDK 内的 debug.c 中出现的代码,显然是为了 Keil 准备的。
struct __FILE
{
int handle;
};
FILE __stdout;
static u8 p_us=0;
static u16 p_ms=0;
int fputc(int data, FILE *f)
{
#if (DEBUG == DEBUG_UART1)
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
USART_SendData(USART1, (u8) data);
#elif (DEBUG == DEBUG_UART2)
while (USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);
USART_SendData(USART2, (u8) data);
#elif (DEBUG == DEBUG_UART3)
while (USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET);
USART_SendData(USART3, (u8) data);
#endif
return data;
}
当然这三类直接拿来用显然都不是很方便。
没有直接的支持只能手动调用 fputc 了,自定义一个 printf,使用va_xxx 合成字符串,然后挨个字符传给 fputc,这样也可以实现正常的串口打印功能。下面是一段示例代码。
#include <stdarg.h>
#define BUFSIZE 1024
char myprintf_buf[BUFSIZE];
/*
* redirect the printing to COM
*/
void my_printf(const char* fmt, ...)
{
va_list args;
int n;
va_start(args, fmt);
n = vsnprintf(myprintf_buf, BUFSIZE, fmt, args);
va_end(args);
int i = 0;
for(i = 0; i < n; i++)
{
fputc(myprintf_buf[i],0);
}
}
目前 Nano Code 的 Output 窗口内,暂时还无法看到串口输出,该功能后续会添加上去,请耐心等待。
最后编辑:李宜桐 更新时间:2024-05-24 18:52