OpenEdv-开源电子网

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

232发送两字节,delay超过5us串口就溢出了,求教

[复制链接]

10

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
94
金钱
94
注册时间
2015-8-1
在线时间
11 小时
发表于 2015-10-31 17:57:06 | 显示全部楼层 |阅读模式
5金钱
[mw_shl_code=c,true][/mw_shl_code] [mw_shl_code=c,true]void delay_us(u32 nus) { u32 temp;       SysTick->LOAD=nus*fac_us; //     SysTick->VAL=0x00;        // SysTick->CTRL=0x01 ;      //   do { temp=SysTick->CTRL; } while(temp&0x01&&!(temp&(1<<16)));//    SysTick->CTRL=0x00;       // SysTick->VAL =0X00;       //   }//这是delay [/mw_shl_code] [mw_shl_code=c,true][/mw_shl_code] [mw_shl_code=c,true][/mw_shl_code] [mw_shl_code=c,true]while(1) { if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) { static int k = 0; uint16_t RxBuf1[2]={0x0000,0x0000},TxBuf1[2]={0x0000,0x0000}; for (k=0;k<2;k++) {RxBuf1[k]=USART_ReceiveData(USART1);//USART1->DR; // writ_shift_register1(RxBuf1[0]);//aa , , // writ_shift_register1(RxBuf1[1]);//ff AD5320 = (RxBuf1[0]<<8) | RxBuf1[1]; writ_shift_register(AD5320); writ_shift_register1(AD5320); TxBuf1[k]=RxBuf1[k]; USART_SendData(USART1,TxBuf1[k]); } } delay_us(9); } } [/mw_shl_code] [mw_shl_code=c,true] [/mw_shl_code]

最佳答案

查看完整内容[请看2#楼]

丢数据正常. 串口发多个数据的时候,并不会等待你下面是否接收完成,你搞个什么delay不是明摆着要丢数据嘛....
每个人都说我蠢い
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-10-31 17:57:07 | 显示全部楼层
丢数据正常.
串口发多个数据的时候,并不会等待你下面是否接收完成,你搞个什么delay不是明摆着要丢数据嘛....
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

10

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
94
金钱
94
注册时间
2015-8-1
在线时间
11 小时
 楼主| 发表于 2015-10-31 17:57:07 | 显示全部楼层
妈呀  ,找到问题了NVIC忘记改了!!!耽误大家时间了  ,么么,
每个人都说我蠢い
回复

使用道具 举报

10

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
94
金钱
94
注册时间
2015-8-1
在线时间
11 小时
 楼主| 发表于 2015-10-31 18:06:24 | 显示全部楼层
delay_us(5);这个是好的  



delay_us(9);


图发不了、发了是乱码


 

串口调试助手显示


 

[17:46:13.791] 09 5A
[17:46:17.912] 09 5A
[17:46:19.409] 09 09
[17:46:23.121] 09 09
[17:46:25.162] 09 5A
[17:46:27.035] 09 5A
[17:46:28.634] 09 09
[17:46:30.195] 09 5A
[17:46:31.839] 09 5A
[17:46:33.277] 09 09
[17:46:34.505] 09 5A
[17:46:35.572] 09 5A
[17:46:36.510] 09 5A
[17:46:37.320] 09 5A
[17:46:38.253] 09 5A
[17:46:41.149] 09 09 
前面是时间  发的是095a
每个人都说我蠢い
回复

使用道具 举报

2

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2013-4-26
在线时间
4 小时
发表于 2015-10-31 18:58:12 | 显示全部楼层

我也有类似的问题,我是直接调用

USART_SendData(USART3,Data1);
USART_SendData(USART3,Data2);

然后串口调试助手里面就只能接受到Data2,前面一个字节好像是被覆盖了?应该怎么解决啊

回复

使用道具 举报

10

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
94
金钱
94
注册时间
2015-8-1
在线时间
11 小时
 楼主| 发表于 2015-10-31 19:39:26 | 显示全部楼层
回复【3楼】Bubble:
---------------------------------
⊙﹏⊙b汗   为什么不是只有Data1   不是应该先搞Data1嘛
每个人都说我蠢い
回复

使用道具 举报

20

主题

87

帖子

0

精华

初级会员

Rank: 2

积分
189
金钱
189
注册时间
2014-8-24
在线时间
0 小时
发表于 2015-10-31 20:41:17 | 显示全部楼层
关闭串口的错误溢出检测功能可以解决溢出错误产生的中断,至于你为何加delay确实让然摸不着头脑,难道你就不怕在你delay过程当中错过了某些数据?
哥的世界,你们不懂!
回复

使用道具 举报

105

主题

522

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1386
金钱
1386
注册时间
2012-10-23
在线时间
97 小时
发表于 2015-10-31 21:06:02 | 显示全部楼层
接收到一个数据为什么要 for (k=0;k<2;k++)
回复

使用道具 举报

10

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
94
金钱
94
注册时间
2015-8-1
在线时间
11 小时
 楼主| 发表于 2015-10-31 21:27:30 | 显示全部楼层
回复【6楼】miaoguoqiang:
---------------------------------
RxBuf1[0]和RxBuf1[1]  要把这两个字节写入AD5320中   ~~~~(>_<)~~~~
每个人都说我蠢い
回复

使用道具 举报

105

主题

522

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1386
金钱
1386
注册时间
2012-10-23
在线时间
97 小时
发表于 2015-11-1 10:04:38 | 显示全部楼层
回复【7楼】wuyang:
---------------------------------.
收到一个数据。然后for,相当于把接收到的一个数据复制一遍给了AD5320.
运气好收到的是两个不同数据,运气不好收到的是一个数据,和它本身的一个复制。

回复

使用道具 举报

10

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
94
金钱
94
注册时间
2015-8-1
在线时间
11 小时
 楼主| 发表于 2015-11-2 08:42:00 | 显示全部楼层
回复【9楼】正点原子:
---------------------------------
while(1)              
     {  
 
        if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
        {
      static int k = 0;
              uint16_t RxBuf1[2]={0x0000,0x0000},TxBuf1[2]={0x0000,0x0000};
              for (k=0;k<2;k++)
             {RxBuf1[k]=USART_ReceiveData(USART1);//USART1->DR;
//       writ_shift_register1(RxBuf1[0]);//aa , ,
//       writ_shift_register1(RxBuf1[1]);//ff 
      AD5320 = (RxBuf1[0]<<8) | RxBuf1[1];
      writ_shift_register(AD5320);
      writ_shift_register1(AD5320); 
////        TxBuf1[k]=RxBuf1[k];
////        USART_SendData(USART1,TxBuf1[k]);
        }
}

        adc_v = Get_SpecChannelAddr_ADC(ADC1, ADC_Channel_12, ADC_SampleTime_239Cycles5, 0);//28v
        adc_v1= GetVolt(adc_v);//
        data[1] = (uint8_t)((adc_v1 >> 8) & 0xff);
        data[2] = (uint8_t)(adc_v1 & 0xff);
        RS232_SendData(data, 3); 
       delay_ms(10);  
        ////////////////////////
adc_v = Get_SpecChannelAddr_ADC(ADC1, ADC_Channel_13, ADC_SampleTime_239Cycles5, 0);//mcu0
        adc_v1= GetVolt(adc_v);//
        ////////////////////////
adc_v = Get_SpecChannelAddr_ADC(ADC1, ADC_Channel_0, ADC_SampleTime_239Cycles5, 0);//mcu1
        adc_v2= GetVolt(adc_v);//
        ////////////////////////
        amp0 = AD5320/4096*3.3*3;
mcu0 = adc_v1/100;
mcu1 = adc_v2/100;


        AI = (adc_v1 + adc_v2)/0.31;//4??
data[1] = (uint8_t)((AI >> 8) & 0xff);
        data[2] = (uint8_t)(AI & 0xff);
        RS232_SendData(data, 3);   
delay_ms(10);
delay_ms(10);
delay_ms(10);
//////////////////////
adcData = readMax31855Temp(0);
Tx232_Data[0] = 0xAA;
Tx232_Data[1] = (uint8_t)((adcData >> 24) & 0xff);
Tx232_Data[2] = (uint8_t)((adcData >> 16) & 0xff);
Tx232_Data[3] = (uint8_t)((adcData >> 8) & 0xff);
Tx232_Data[4] = (uint8_t)((adcData >> 0) & 0xff);
        RS232_SendData(Tx232_Data, 5);  
//////////////////////
fan_check();
//////////////////////
lcd_show();
 //////////////////////

    }         
}


 是后面要用到!!!⊙﹏⊙b汗     大神指点一二!!!
每个人都说我蠢い
回复

使用道具 举报

70

主题

6763

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13129
金钱
13129
注册时间
2012-11-26
在线时间
3814 小时
发表于 2015-11-2 08:48:42 | 显示全部楼层
回复【10楼】wuyang:
---------------------------------
发送数据前判断   发送区是否为空  而不是delay 5us  实际上 你多delay一会是可以解决这个问题的,但只是治标不治本
学无止境
回复

使用道具 举报

2

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2013-4-26
在线时间
4 小时
发表于 2015-11-2 12:03:04 | 显示全部楼层
回复【11楼】jermy_z:
---------------------------------
谢谢大牛们!
终于搞定了,原来我查询错状态了,我之前在发送后查询的是USART_IT_TXE,晕死。改成查询USART_FLAG_TXE就OK了,我就说嘛。
回复

使用道具 举报

10

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
94
金钱
94
注册时间
2015-8-1
在线时间
11 小时
 楼主| 发表于 2015-11-2 12:07:26 | 显示全部楼层
回复【12楼】Bubble:
---------------------------------
╭(╯3╰)╮  能给我来份你的程序吗   谢谢了!!!951078819@qq.com
每个人都说我蠢い
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-19 18:44

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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