你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

关于USART中的getchar()函数的问题

[复制链接]
电小龙 提问时间:2016-9-21 09:52 /
在STM32中是不是只要初始化了USART之后,然后再加上#ifdef __GNUC__/* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
   set to 'Yes') calls __io_putchar() */
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#define GETCHAR_PROTOTYPE int __io_getchar(FILE *f)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#define GETCHAR_PROTOTYPE int fgetc(FILE *f)
#endif /* __GNUC__ */

和下面这两个函数定义
PUTCHAR_PROTOTYPE
{
  /* Place your implementation of fputc here */
  /* e.g. write a character to the USART1 and Loop until the end of transmission */
  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);

  return ch;
}

GETCHAR_PROTOTYPE
{
  uint8_t ch = 0;
  HAL_UART_Receive(&huart1,&ch, 1, 0xffff);
  return ch;
}

就可以用getchar 和printf到串口助手上去了啊?目前我可以实现printf的功能,但是getchar的功能还是不能实现。不知道哪里有问题?有大神知道的吗,指点一二吧,在线等。。。


收藏 2 评论15 发布时间:2016-9-21 09:52

举报

15个回答
电小龙 回答时间:2016-9-21 09:59:24
不能沉啊,学STM32卡在这里了
电小龙 回答时间:2016-9-21 10:01:40
会不会是我初始化USART有问题,但是Printf函数能正常使用的。。。
废鱼 回答时间:2016-9-21 10:06:54
读取时把时间缩短一下,1秒的超时最好。读取的时候,要有数据发送过来,不然收不到数据。楼主这个应该是卡死在getchar里面了吧。
电小龙 回答时间:2016-9-21 10:13:46
安 发表于 2016-9-21 10:06
读取时把时间缩短一下,1秒的超时最好。读取的时候,要有数据发送过来,不然收不到数据。楼主这个应该是卡 ...

谢谢我试试,但是我看见硬石里面写的是这样的
int fputc(int ch, FILE *f)
{
  HAL_UART_Transmit(&husart_debug, (uint8_t *)&ch, 1, 0xffff);
  return ch;
}

/**
  * º¯Êý¹¦ÄÜ: Öض¨Ïòc¿âº¯Êýgetchar,scanfµ½DEBUG_USARTx
  * ÊäÈë²ÎÊý: ÎÞ
  * ·µ »Ø Öµ: ÎÞ
  * ˵    Ã÷£ºÎÞ
  */
int fgetc(FILE * f)
{
  uint8_t ch = 0;
  HAL_UART_Receive(&husart_debug,&ch, 1, 0xffff);
  return ch;
}
他也没有说把时间改小。卡死在getchar应该也不是,我在getchar下面写了printf函数,结果printf函数一直在发送数据
电小龙 回答时间:2016-9-21 10:18:38
安 发表于 2016-9-21 10:06
读取时把时间缩短一下,1秒的超时最好。读取的时候,要有数据发送过来,不然收不到数据。楼主这个应该是卡 ...

还有就是我把两个函数定义换成跟硬石里面一样的时候,发现printf函数也用不了了,我比较了不同的是第一个参数不同,我的地&huart1,硬石的是&huart_debug
电小龙 回答时间:2016-9-21 10:21:11
安 发表于 2016-9-21 10:06
读取时把时间缩短一下,1秒的超时最好。读取的时候,要有数据发送过来,不然收不到数据。楼主这个应该是卡 ...

大神我说错了,是在getchar卡死了,麻烦大神帮我分析一下可能是什么问题
废鱼 回答时间:2016-9-21 10:30:15
HAL_UART_Receive(&husart_debug,&ch, 1, 0xffff);
这个用你之前能printf的husart,后面的0xFFFF改为1000

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

电小龙 回答时间:2016-9-21 10:31:20
安 发表于 2016-9-21 10:06
读取时把时间缩短一下,1秒的超时最好。读取的时候,要有数据发送过来,不然收不到数据。楼主这个应该是卡 ...

问题已解决,非常感谢。正是你说的那样改短时间就好了,膜拜。。。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

电小龙 回答时间:2016-9-21 10:32:27
安 发表于 2016-9-21 10:30
HAL_UART_Receive(&husart_debug,&ch, 1, 0xffff);
这个用你之前能printf的husart,后面的0xFFFF改为1000 ...

谢谢,已经解决了,正是你说的那样
高二毛 回答时间:2016-9-21 10:35:59
学习了。其实关于printf和getchar你可以自己写一个,或者参考一下网上的例子做一个。这样就不用局限于系统提供的,并且想用什么借口print都可以,比如USB.
废鱼 回答时间:2016-9-21 11:46:35
不客气,有问题发帖即可。
电小龙 回答时间:2016-9-21 13:56:01
在这个平台学习STM32真的会事半功倍,里面有好多无私的大神。。。
zbber 回答时间:2016-9-22 07:24:56
好帖子顶一顶!感谢楼主
电小龙 回答时间:2016-9-22 07:31:45
zbber 发表于 2016-9-22 07:24
好帖子顶一顶!感谢楼主

共同学习,这个STM32学习平台真的很好,会让人迷上STM32的
12下一页

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版