OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 8539|回复: 9

求问关于串口的问题,发送的数据一直没有任何反应呀。

[复制链接]

4

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2013-6-7
在线时间
0 小时
发表于 2013-6-9 12:34:34 | 显示全部楼层 |阅读模式
我通过串口调试助手发送03020100,但是没有任何反应啊,这是为什么呢?

工程说明:希望通过串口发送一段数字,如输入03 02 01 00,其中03代表指令包长度,02代表指令码,01代表要将LED灯点亮,00表示指令结束
程序如下:
u8  USART_RX_BUF[USART_REC_LEN];     //设置buf,最大长度USART_REC_LEN
//初始化,设置波特率
void uart_init(u32 bound)
{

    GPIO_InitTypeDef GPIO_InitStructure;

    USART_InitTypeDef USART_InitStructure;
 
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
     
    USART_DeInit(USART3);
  
//USART3_TX   PB10
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; 
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOB, &GPIO_InitStructure); 
   
    //USART3_RX  B11
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOB, &GPIO_InitStructure);  


USART_InitStructure.USART_BaudRate = bound;
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;

  USART_Init(USART3, &USART_InitStructure);
  USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
  USART_Cmd(USART3, ENABLE);                    
  USART_ClearFlag(USART3, USART_FLAG_TC); //防止第一位丢失

}


/******发送一个字符******/

u16 USART_PutChar(u16 ch)
{
USART_SendData(USART3,ch);
while(USART_GetFlagStatus(USART3,USART_FLAG_TXE) == RESET){} //发送完成
return ch;
}
/******接收一个字符*******/
u16 USART_GetChar(void)
{
uint16_t temp;
while(USART_GetFlagStatus(USART3,USART_FLAG_RXNE) == RESET);         //接收完成
temp = USART_ReceiveData(USART3);
return temp;
}

/********发送一个字符串***********/
void USART_PutString(u8 *buf, u8 length)
{
int j;
for( j=0; j<length;j++)
{
USART_PutChar(*buf++);
}
}

/*********接收一个字符串**********/
void USART_GetBuf(u8 *buf, u8 length)
{
int i;
for(i=0;i<length;i++)
{
buf = USART_GetChar() && 0x00ff;
}
}

void packed_get(void) 
{
while(1)
{
CURRENT_LEN = (uint8_t)USART_GetChar(); //第一个字节为命令字节数
USART_GetBuf(USART_RX_BUF,CURRENT_LEN);                                    //将从USART中得到的数据送入USART_RX_BUF中去
if(USART_RX_BUF[CURRENT_LEN-1] == 0)break;                                    //如果得到的数据是00,表示指令结束

}
}

在main函数中:
int main(void)
{
    u8 *point = 0;
    uart_init(115200); //波特率115200

    while(1)
    {
        packed_get();
        point = USART_RX_BUF;                //指针指向 USART_RX_BUF,此时指针指向 03 的地址
        point++;                                       //使指针指向02的地址

        while(1) 
{           
switch(*point)                   // 对指令码进行判断
{
case 0x02:                //指令码是 02 
{
point++;          //指向01的地址
if(*point == 1)    //如果值为01
{
GPIO_SetBits(GPIOB,GPIO_Pin_13);            //点亮LED灯
}
                                point+=1;    
}

case 0x50: //如果指令码是50
{
point++;            //指向指令码后面的数,其为需要从USART读的数的长度
len = *point;       //得到长度
                                point++;            //指向需要从USART读的第一个数的地址
USART_GetBuf(point,len);            //再从USART读,这句不对,可是我不知道怎样写
point+=len;        //指针往后加
len = 0;            //清零
}
break;

case 0x00:
break;

default: break;
   }
    }
}
}

最后再说明一下,如果我发送的指令是 06 02 01 50 05 0001020304 00,就表示我的整条指令长度06 第一个指令码 02 第一条指令 01 ,第二条指令码50,要读的数的长度 05 要读的数为 0001020304,最后结束指令00.

求站长大大帮帮我,我原来是学生物的,现在慢慢喜欢上电子了。但是基础好差,比如C语言等等,正在学习,谢谢论坛,谢谢站长。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-6-9 14:59:10 | 显示全部楼层
你这代码貌似不是用我们的改的,你时钟什么的初始化对了吧?
串口通信,你先测试好串口收发有无问题,再做应用设计.
也就是先搞通底层,再搞应用.
你直接发送数据,接收数据,有无问题?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

4

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2013-6-7
在线时间
0 小时
 楼主| 发表于 2013-6-9 15:23:17 | 显示全部楼层


回复【2楼】正点原子:
---------------------------------
额……我还真是用您的代码改的,现在是这样的,我在while(1)中写

Res = USART_ReceiveData(USART3);
USART_SendData(USART1,Res);
时是对的,可是如果我换成下面的语句的话,就有问题了。下面的语句我通过串口调试助手发送FF FA CB 99,读出来的数应该只有FF才对,可是出现的状况是下图的样子,有时数据是对的,有时数据时错的,可是每次都是四个数一起出来,出来的数据部应该只是FF吗?

 USART_GetBuf(USART_RX_BUF, 2);
Res1 = USART_RX_BUF[0];
Res2 = USART_RX_BUF[1];
// delay_ms(10);
USART_PutString(USART_RX_BUF, 1);



回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-6-9 19:02:53 | 显示全部楼层
回复【3楼】parallal:
---------------------------------
有没有仿真器的?
可以跟踪代码看一下.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

4

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2013-6-7
在线时间
0 小时
 楼主| 发表于 2013-6-9 19:27:18 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
站长大大我解决了,不过还有一个问题哈
/******发送一个字符******/

u16 USART_PutChar(u16 ch)
{
USART_SendData(USART3,ch);
while(USART_GetFlagStatus(USART3,USART_FLAG_TC) == RESET){} //·????ê??±ê????
return ch;
}
/******接收一个字符*******/
u16 USART_GetChar(void)
{
uint16_t temp;
while(USART_GetFlagStatus(USART3,USART_FLAG_RXNE) == RESET) //?????????????÷·???±ê??
temp = USART_ReceiveData(USART3);
return temp;
}

/********发送一个数组***********/
void USART_PutBuf(u8 *buf, u8 length)
{
int j;
for( j=0; j<length;j++)
{
USART_PutChar(*buf++);
}
}

/*********接收一个数组**********/
void USART_GetBuf(u8 *buf, u8 length)
{
int i;
for(i=0;i<length;i++)
{
buf = USART_GetChar() && 0x00ff;
}
}

其中TC和RXNE配置对吗?就是两个while里面。上面四个函数如果没有问题的话为什么我向串口发不进去数据呢? 

还有,我在使用函数USART_GetBuf(USART_RX_BUF,CURRENT_LEN);后
定义了一个u8 *point;point = USART_RX_BUF然后这样写为什么不对?USART_GetBuf(point,len);

谢谢站长>
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-6-10 00:51:59 | 显示全部楼层
回复【5楼】parallal:
---------------------------------
看代码貌似没问题了.
point指向BUF也没问题,是可以这么用.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

4

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2013-6-7
在线时间
0 小时
 楼主| 发表于 2013-6-13 10:41:52 | 显示全部楼层
谢谢站长大大。。我先前的原因是因为时钟配置的问题,我用的是12M的HSE。现在的问题是:我用串口调试助手发送一个数之后,然后会不断的接收到我刚才发的那个数,为什么不是get一次,然后串口put一次呢? 

我在main里面这样写
while(1)
{
   Res = USART_GetChar();
   USART_PutChar(Res);
}

回复 支持 反对

使用道具 举报

4

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2013-6-7
在线时间
0 小时
 楼主| 发表于 2013-6-13 18:48:41 | 显示全部楼层
谢谢站长了,我已经完全解决了
回复 支持 反对

使用道具 举报

4

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2013-6-7
在线时间
0 小时
 楼主| 发表于 2013-6-14 16:37:05 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
站长,再次求助。昨天我是测试通过了USART_PutChar和USART_GetChar两个函数,单个数的发送和接收。这个完全正常了。但是在USART_PutBuf和USART_GetBuf使用时却又出现问题了,具体是这样的:

  Res = (uint8_t)USART_GetChar();
USART_GetBuf(USART_RX_BUF,Res);
USART_PutBuf(USART_RX_BUF,Res);
然后我发送的数据是 15 20 10 50 05 00 01 02 03 04 11 00 01 60 50,为什么出来的数却是:20 10 50 00 01 02 03 04 11 00 01 60 50 15 20 10 50 05 00 01,并且有时出来的数多,有时少?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-6-15 00:30:46 | 显示全部楼层
你这是自发自收么?
还是和电脑通信?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-18 19:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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