硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1016|回复: 3
收起左侧

新人求助,V6串口相关问题

[复制链接]

4

主题

2

回帖

14

积分

新手上路

积分
14
发表于 2022-4-4 21:36:00 | 显示全部楼层 |阅读模式
新人刚刚开始学用32做项目,在看PDF和修改程序时产生了一些疑问如下:
1.我在使用fgetc函数时发现例程里提供的程序和PDF中不同.
int fgetc(FILE *f)中的FILE *f在实际使用时应该怎么用啊,定义一个空的FILE类型变量吗
2.我在使用fgetc函数时发现例程里提供的程序和PDF中不同.
假如我想使用PDF中的HAL_UART_Receive(&UartHandle, (uint8_t *)&ret, 1, HAL_MAX_DELAY);我要定义一个UartHandle的全局变量吗
1649079240(1).png
3.定义的全局变量是这样定义吗
1649079323(1).png


回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115661
QQ
发表于 2022-4-5 16:36:00 | 显示全部楼层
fgetc例程和PDF中是一样的。
我们一直是这种玩法。
image.png


如果使用了Event Recorder是另一种重定向玩法。

楼主这种直接在fgetc里面使用HAL库的函数,我们一般不用,效率太低,我早期做的一个H7的例子,我是楼主这种方式写的:

https://www.armbbs.cn/forum.php?mod=viewthread&tid=86174

我们实际配套开发板的例子,不这么用。

[C] 纯文本查看 复制代码
/*
*********************************************************************************************************
*        函 数 名: fputc
*        功能说明: 重定义putc函数,这样可以使用printf函数从串口1打印输出
*        形    参: 无
*        返 回 值: 无
*********************************************************************************************************
*/
int fputc(int ch, FILE *f)
{
        HAL_UART_Transmit(&UartHandle, (uint8_t *)&ch, 1, HAL_MAX_DELAY);

        return ch;
}

/*
*********************************************************************************************************
*        函 数 名: fgetc
*        功能说明: 重定义getc函数,这样可以使用scanff函数从串口1输入数据
*        形    参: 无
*        返 回 值: 无
*********************************************************************************************************
*/
int fgetc(FILE *f)
{
    int ret;
                
        HAL_UART_Receive(&UartHandle, (uint8_t *)&ret, 1, HAL_MAX_DELAY);

        return ret;
}





回复

使用道具 举报

4

主题

2

回帖

14

积分

新手上路

积分
14
 楼主| 发表于 2022-4-5 21:26:59 | 显示全部楼层
这样啊,太深的东西我还不太懂,我照着例程对比网上的例子改成了如下程序:
主要功能:每当传输超过50个或者存在换行时,将串口接受的字符串保存起来供其他程序使用
想请大佬提点建议

[C] 纯文本查看 复制代码
char USART_ReceiveData[50];
char ReceiveData_save[50];
char esp_to_UART[50];
int Receive_sum = 0;
uint8_t read;

/* 定义一个串口函数,简化后续代码 
	串口接收最大50位的字符串,并输出相应信息
	判断GPIO引脚是否有效按下
*/
char * uart_reseive_user(COM_PORT_E _ucPort)
{
	while (comGetChar(_ucPort, &read))
	{
		int receive_over = 1;
		Receive_sum ++;
		bsp_LedToggle(2);
		USART_ReceiveData[Receive_sum-1] = read;
		if (Receive_sum > 49)
		{
			USART_ReceiveData[49] = '\0';
			comSendBuf(_ucPort, (uint8_t *)"Over_Size\r\n", strlen("Over_Size\r\n"));
			receive_over = 0;
		}
		if(USART_ReceiveData[Receive_sum-2] == '\r' && USART_ReceiveData[Receive_sum-1] == '\n' )
		{
			USART_ReceiveData[Receive_sum-1] = '\0';						
			USART_ReceiveData[Receive_sum-2] = '\0';											//接收标志位置1,停止接收数据
			comSendBuf(_ucPort, (uint8_t *)USART_ReceiveData, strlen(USART_ReceiveData));
			receive_over = 0;
		}
		if(Receive_sum == 50 || receive_over == 0)
		{
			memset(ReceiveData_save, 0, sizeof ReceiveData_save); 
			strcpy(ReceiveData_save,USART_ReceiveData);
			memset(USART_ReceiveData, 0, sizeof USART_ReceiveData); 
			Receive_sum =0;
		}
	}
	return ReceiveData_save;
}
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115661
QQ
发表于 2022-4-6 02:26:14 | 显示全部楼层
TC130 发表于 2022-4-5 21:26
这样啊,太深的东西我还不太懂,我照着例程对比网上的例子改成了如下程序:
主要功能:每当传输超过50个或 ...

串口FIFO的comGetChar函数正确使用姿势
https://www.armbbs.cn/forum.php? ... 4579&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-5-10 11:13 , Processed in 0.272047 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表