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

查看: 12203|回复: 8

初学STM32,菜鸟求助输入输出字符串问题

[复制链接]

1

主题

9

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
发表于 2012-6-26 10:36:38 | 显示全部楼层 |阅读模式
菜鸟刚入手STM32F103RBV6的板子,没什么底子,现在要写一个USART的串口输入输出字符串问题,以前用查询的方式出现乱码,现在采用中断方式,设一个接收的BUFFER在接收中断中,再在MAIN函数中输出,感觉很简单,却怎么也无法成功,在网上找了很多代码都不是很好,求好心大大指教~~~~~~,
 
下面是我自己根据一些例程写的代码,,,还是出错,不知道哪位大大可以帮忙指点,改来改去,在调试中一步一步运行能得到正确结果,但是全速运行就出现问题了,谁能帮忙改改~~~~~~C功底差~~有错请指正,
-------------------------刚刚尝试在if(RxHaveData != 0){}里的最前面加了一个DELAY(10000)问题居然解决 了。。。至今不知道是什么问题引起,求解
 
------------------------------------------------------------------------------------------------------------------------
stm32f10x_it.c里
 
 

#define NbrOfDataToRead 20


extern u8 Buffersize;
extern u8 RxHaveData;
extern u8 RxBuffer[NbrOfDataToRead];
extern u8 RxCounter;
extern u8 RxHaveData;
u8 tmp;

 
#define NbrOfDataToRead 20
<font color="#ff0000" size="2"> 
void USART1_IRQHandler(void)
{    
   
      if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
   {
  
      tmp = USART_ReceiveData(USART1);
      USART_ClearITPendingBit(USART1, USART_IT_RXNE);
      if(RxCounter == NbrOfDataToRead || tmp == 0x0d||tmp == 0x0a)
      {  
          if(RxCounter == 0)
         {
            RxHaveData = 0;
         }
         else
        {
           RxHaveData = 1;

        }
          
          USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);
        
  
     } 

     else
    {
      RxBuffer[RxCounter] = tmp;
      RxCounter++;
     Buffersize++;
   }
 }

}
main.c主函数里
#include "stm32f10x_lib.h"

#define NbrOfDataToRead 20
ErrorStatus HSEStartUpStatus;

u8 RxBuffer[NbrOfDataToRead];
u8 RxCounter = 0;
u8 Buffersize = 0;
u8 RxHaveData = 0;


void USART_Configuration(void);
void RCC_Configuration(void);
void GPIO_Configuration(void);
void NVIC_Configuration(void);
u8 Uart1_Putchar(u8 ch);
void Uart1_Putstring(u8* buf, u8 len);
void Uart1_Putstring1(u8* buf);

 

<span style="color: rgb(51, 51, 153);">int main(void)
{
     u8 j = 0;
    u8 TxBuf[]="Welcome to my STM32!\r\n";
    RCC_Configuration();
    GPIO_Configuration();
    USART_Configuration();
    NVIC_Configuration();

  
  while (1)
  { 
   
     if(j
<
回复

使用道具 举报

1

主题

9

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
 楼主| 发表于 2012-6-26 11:58:29 | 显示全部楼层

回复:初学STM32,菜鸟求助输入输出字符串问题

急求,自己顶一下~
回复 支持 反对

使用道具 举报

25

主题

446

回帖

0

蝴蝶豆

中级会员

最后登录
2019-12-10
发表于 2012-6-27 20:11:19 | 显示全部楼层

RE:初学STM32,菜鸟求助输入输出字符串问题

字符串的发送接收建议定义一个简单的协议吧,比方说#abcdef*,其中#标识字符串开始,*表示字符串结束,由于中断中一次只能接收一个字符,采用这方式应该很管用。另外,串口收发数据可能会因为干扰出现乱码,想办法判断一下,办法很多,像CRC等
回复 支持 反对

使用道具 举报

48

主题

209

回帖

0

蝴蝶豆

金牌会员

最后登录
1970-1-1
发表于 2012-6-27 22:42:06 | 显示全部楼层

RE:初学STM32,菜鸟求助输入输出字符串问题

STM32串口通信中使用printf发送数据配置方法(开发环境 Keil RVMDK)
标签:  STM32  串口通信  printf方法  2011-06-29 23:29
在STM32串口通信程序中使用printf发送数据,非常的方便。可在刚开始使用的时候总是遇到问题,常见的是硬件访真时无法进入main主函数,其实只要简单的配置一下就可以了。

下面就说一下使用printf需要做哪些配置。

有两种配置方法:
一、对工程属性进行配置,详细步骤如下
1、首先要在你的main 文件中 包含“stdio.h” (标准输入输出头文件)。
2、在main文件中重定义函数    如下:
   // 发送数据
   int fputc(int ch, FILE *f)
   {
      USART_SendData(USART1, (unsigned char) ch);// USART1 可以换成 USART2 等
      while (!(USART1-&gt;SR &amp; USART_FLAG_TXE));
      return (ch);
   }
   // 接收数据
   int GetKey (void)  {
      while (!(USART1-&gt;SR &amp; USART_FLAG_RXNE));
      return ((int)(USART1-&gt;DR &amp; 0x1FF));
   }
   这样在使用printf时就会调用自定义的fputc函数,来发送字符。
3、在工程属性的 “Target&quot; -&gt; &quot;Code Generation&quot; 选项中勾选 &quot;Use MicroLIB&quot;”
   MicroLIB 是缺省C的备份库,关于它可以到网上查找详细资料。

至此完成配置,在工程中可以随意使用printf向串口发送数据了。

二、第二种方法是在工程中添加“Regtarge.c”文件
1、在main文件中包含 “stdio.h” 文件
2、在工程中创建一个文件保存为 Regtarge.c , 然后将其添加工程中
在文件中输入如下内容(直接复制即可)
#include
#include
#pragma import(__use_no_semihosting_swi)
extern int  SendChar(int ch); // 声明外部函数,在main文件中定义
extern int  GetKey(void);
struct __FILE {
  int handle;                 // Add whatever you need here
};
FILE __stdout;
FILE __stdin;
int fputc(int ch, FILE *f) {
  return (SendChar(ch));
}
int fgetc(FILE *f) {
  return (SendChar(GetKey()));
}
void _ttywrch(int ch) {
SendChar (ch);
}
int ferror(FILE *f) {                            // Your implementation of ferror
  return EOF;
}
void _sys_exit(int return_code) {
label:  goto label;           // endless loop
}

3、在main文件中添加定义以下两个函数
int SendChar (int ch)  {
  while (!(USART1-&gt;SR &amp; USART_FLAG_TXE)); // USART1 可换成你程序中通信的串口
  USART1-&gt;DR = (ch &amp; 0x1FF);
  return (ch);
}
int GetKey (void)  {
  while (!(USART1-&gt;SR &amp; USART_FLAG_RXNE));
  return ((int)(USART1-&gt;DR &amp; 0x1FF));
}
至此完成配置,可以在main文件中随意使用 printf 。
回复 支持 反对

使用道具 举报

48

主题

209

回帖

0

蝴蝶豆

金牌会员

最后登录
1970-1-1
发表于 2012-6-27 22:42:37 | 显示全部楼层

RE:初学STM32,菜鸟求助输入输出字符串问题

绝对好用,试试!!!!!!!!
回复 支持 反对

使用道具 举报

1

主题

9

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
 楼主| 发表于 2012-6-28 10:00:55 | 显示全部楼层

回复:初学STM32,菜鸟求助输入输出字符串问题

回复第 6 楼 于2012-06-27 22:42:37发表:
绝对好用,试试!!!!!!!! 
菜鸟,看着有点复杂~~
回复 支持 反对

使用道具 举报

1

主题

9

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
 楼主| 发表于 2012-6-28 15:21:09 | 显示全部楼层

回复:初学STM32,菜鸟求助输入输出字符串问题

自己顶一下~~~~~继续求助,就是首字符出现乱码
回复 支持 反对

使用道具 举报

7

主题

78

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
发表于 2012-6-29 10:22:39 | 显示全部楼层

RE:初学STM32,菜鸟求助输入输出字符串问题

楼主看一下,这个程序精简好使,相信楼主会有很大收获,豁然开朗的

三行代码实现字符与字符串的串口输出.txt

下载

1.09 KB, 下载次数: 139

回复 支持 反对

使用道具 举报

0

主题

1

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
发表于 2013-1-5 13:25:40 | 显示全部楼层

RE:初学STM32,菜鸟求助输入输出字符串问题


学习了
回复 支持 反对

使用道具 举报

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版