打印

STM32串口发送问题

[复制链接]
2189|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ENewBird|  楼主 | 2013-7-14 17:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
程序如下:
void USART_SendOneByte(uint16_t        dat)
{
        USART_SendData(USART1, dat);
        while(USART_GetFlagStatus(USART1, USART_FLAG_TXE)==RESET);
}

uint8_t Uart_PutChar(uint8_t ch)
{
/* Write a character to the USART */
    USART_SendData(USART1, (uint8_t) ch);
    while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)
    {
    }
    return ch;
}



uint16_t USART_RecOneByte()
{
        uint16_t datRec1;
        if(USART_GetFlagStatus(USART1,USART_IT_RXNE)==SET)
    {           
                datRec1 = USART_ReceiveData(USART1);
        }
        return         datRec1;
}

int main(void)
{

  GPIO_InitTypeDef GPIO_InitStructure;
//  datSend[0]=0x01;
//  datSend[1]=0x02;
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB, ENABLE); /*使能LED灯使用的GPIO时钟*/

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_Init(GPIOA, &GPIO_InitStructure);  /*神舟I号使用的LED灯相关的GPIO口初始化*/
  GPIO_Init(GPIOB, &GPIO_InitStructure);
  
  GPIO_SetBits(GPIOA,GPIO_Pin_2|GPIO_Pin_3);           /*关闭所有的LED指示灯*/
  GPIO_SetBits(GPIOB,GPIO_Pin_2);   
   
  // 配置串口参数   
/*
  USART_InitStructure.USART_BaudRate = 9600;
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  USART_InitStructure.USART_StopBits = USART_StopBits_1;
  USART_InitStructure.USART_Parity = USART_Parity_No;
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
*/

  RCC_APB2PeriphClockCmd (RCC_APB2Periph_AFIO|RCC_APB2Periph_USART1,ENABLE);

  USART_ClockStructInit(&USART_ClockInitStructure);
  USART_StructInit(&USART_InitStructure);//装填默认值
  USART_ClockInit(USART1,&USART_ClockInitStructure);


  //STM_EVAL_COMInit(COM1, &USART_InitStructure);
  USART_Init(USART1, &USART_InitStructure);
  USART_Cmd(USART1, ENABLE);

  GPIO_ResetBits(GPIOA,GPIO_Pin_2|GPIO_Pin_3);           /*打开所有的LED指示灯*/
  GPIO_ResetBits(GPIOB,GPIO_Pin_2);  
  

  while (1)
  {               
//                   USART_SendData(USART1, 0x01);
//                while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET){}
//                USART_ClearITPendingBit(USART1, USART_IT_TXE);
//                Delay(500);

                datRec=USART_RecOneByte();
                if(        datRec==0x01)
                {
                         GPIO_SetBits(GPIOA,GPIO_Pin_2|GPIO_Pin_3);           //关闭所有的LED指示灯
                GPIO_SetBits(GPIOB,GPIO_Pin_2);
                        USART_SendOneByte(datRec);
//                        for(i=0;i<2;i++)
//                        {
//                                Uart_PutChar(datSend[i]);
//                        }
                         
                }
                else if(datRec==0x02)
                {
                        GPIO_ResetBits(GPIOA,GPIO_Pin_2|GPIO_Pin_3);           //打开所有的LED指示灯
                GPIO_ResetBits(GPIOB,GPIO_Pin_2);
                        //USART_SendOneByte(datRec);
                        Uart_PutChar(datRec);
                }
       
  }
}
1)以上程序能收到数据,但是发送数据到PC端,PC接收不到数据。
2)还有比较奇怪的问题,在0x01判断的程序里面,如果发送一个数组,编译之后接受也不能接受数据了。
以上程序请各位帮忙看看,本人刚接触ARM。

相关帖子

沙发
long870912| | 2013-7-14 20:13 | 只看该作者
看不明白!

使用特权

评论回复
板凳
冥顽的石头| | 2013-7-14 21:11 | 只看该作者

使用特权

评论回复
地板
ENewBird|  楼主 | 2013-7-15 09:10 | 只看该作者
:L LS别捣乱啊,请高手帮忙啊!

使用特权

评论回复
5
NE5532| | 2013-7-15 10:44 | 只看该作者
你在写这么大一堆程序出来之前,就应该先把发送一个字节的数据调试通过。楼主的问题在于不会规划怎么写一个比较复杂的程序,不会调试。推荐《程序调试黑宝书》

使用特权

评论回复
6
ENewBird|  楼主 | 2013-7-15 11:59 | 只看该作者
谢谢LS回复。

不过我那“一大推程序”其实就是:发送和接收一个字节子函数,和一个main函数,除此之外就是加了个LED的开关。
这应该已经是最基本的字节发送接收程序了,本人刚开始学ARM,的确有很多问题需要去学习。
现在遇到这个问题,也试过很多方法和调试,不过还是不知道问题出在哪,所以帖过来,请各位帮忙看看。

使用特权

评论回复
7
NE5532| | 2013-7-15 13:19 | 只看该作者
没有看到你对串口模块的初始化程序,楼主用的什么库在操作的说?建议看数据手册,清理相关寄存器,自己写初始化。特别是没有看到你的引脚可选功能定义的初始化。

使用特权

评论回复
8
kumuhuakai| | 2013-7-15 17:12 | 只看该作者
本帖最后由 kumuhuakai 于 2013-7-15 17:19 编辑

你引脚没初始化吧
        /* Configure USART1 Tx (PA.9) as alternate function push-pull */
        GPIO_InitStructure.GPIO_Pin         = GPIO_Pin_9;
        GPIO_InitStructure.GPIO_Mode         = GPIO_Mode_AF_PP;
        GPIO_InitStructure.GPIO_Speed         = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
        
        /* Configure USART1 Rx (PA.10) as input floating */
        GPIO_InitStructure.GPIO_Pin         = GPIO_Pin_10;
        GPIO_InitStructure.GPIO_Mode         = GPIO_Mode_IN_FLOATING;
        GPIO_InitStructure.GPIO_Speed         = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
你的片子可能不是PA9和PA10

使用特权

评论回复
9
kumuhuakai| | 2013-7-15 17:18 | 只看该作者
记得把引脚时钟使能

使用特权

评论回复
10
ENewBird|  楼主 | 2013-7-15 19:03 | 只看该作者
谢谢LS,我没有注意USART_Init这个库函数里面没有对引脚进行使能。加上引脚的使能就好了,非常感谢。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

39

帖子

0

粉丝