OpenEdv-开源电子网

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

串口問題求助

[复制链接]

20

主题

75

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
308
金钱
308
注册时间
2013-11-6
在线时间
23 小时
发表于 2013-11-20 10:16:31 | 显示全部楼层 |阅读模式

我在串口中讀取的值會亂碼? 我要把ADC取得值放在串口顯示,但都是亂碼? uart_init是用mini版的串口接口PA9,PA10

超級終端機是用Tera term

int main(void)
{
 //u16 adcx=0;
 float temp;
 SystemInit();
 delay_init(72);    
 NVIC_Configuration();
  uart_init(9600);
  LED_Init();
  KEY_Init();
 Adc_Init();
  PWM_Init(900,0);  //72000/900=8Khz   
 Timerx_Init(5000,7199);
 while(1)
 {
  adcx=Get_Adc(ADC_Channel_1);

  temp=(float)adcx*(3.305/4096);
  adcx=temp;

  //temp-=adcx;
  temp=temp*1000/33;
  //adcx=adcx*1000/33;
  LED0=!LED0;
  delay_ms(250);
  printf("ADC=",temp);
  
 }

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165538
金钱
165538
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-11-20 10:37:35 | 显示全部楼层
回复【楼主位】ChrisLiu1017:
---------------------------------
关键代码没贴...
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

20

主题

75

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
308
金钱
308
注册时间
2013-11-6
在线时间
23 小时
 楼主| 发表于 2013-11-20 13:20:17 | 显示全部楼层
不懂關鍵代碼是指什麼?
上述中Printf("ADC=",temp);修改為Printf("a");
在終端機顯示也為亂碼'g'.
uart_init(9600) =>用原子哥你的
void uart_init(u32 bound){
    
    GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
 
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE);
     //USART1_TX   A.9
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
   
    //USART1_RX   A.10
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStructure);  

  

    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_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(USART1, &USART_InitStructure);
   

    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
    USART_Cmd(USART1, ENABLE);                    

}

void USART1_IRQHandler(void)                
{
u8 Res;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  
{
Res =USART_ReceiveData(USART1);//(USART1->DR);

if((USART_RX_STA&0x80)==0)
{
if(USART_RX_STA&0x40)
{
if(Res!=0x0a)USART_RX_STA=0;
else USART_RX_STA|=0x80;
}
else 
{
if(Res==0x0d)USART_RX_STA|=0x40;
else
{
USART_RX_BUF[USART_RX_STA&0X3F]=Res ;
USART_RX_STA++;
if(USART_RX_STA>63)USART_RX_STA=0;
}  
}
}     
     } 
}
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165538
金钱
165538
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-11-20 13:54:55 | 显示全部楼层
回复【3楼】ChrisLiu1017:
---------------------------------
你说的串口中读取值,乱码,我以为你是在串口中断里面读取ADC的值.
从您后面贴的代码看出,你没有在中断里面读取ADC值.
你说的乱码,应该就是你串口初始化后,波特率不对,导致的.
你软件仿真,看一下经过usart_init(9600)后,串口波特率是不是真是9600?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

20

主题

75

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
308
金钱
308
注册时间
2013-11-6
在线时间
23 小时
 楼主| 发表于 2013-11-20 14:49:29 | 显示全部楼层

波特率確定為9600

再請問一下我要在Keil C看TX RX的波型要如何設定


 

回复 支持 反对

使用道具 举报

65

主题

440

帖子

0

精华

高级会员

Rank: 4

积分
782
金钱
782
注册时间
2012-8-29
在线时间
17 小时
发表于 2013-11-20 15:30:14 | 显示全部楼层
串口显示的是ASCii码,你ADC的取值是16进制码,不转换要乱码的。
人生永远追逐着幻光,但谁把幻光看作幻光,谁便沉入无边的苦海
回复 支持 反对

使用道具 举报

20

主题

75

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
308
金钱
308
注册时间
2013-11-6
在线时间
23 小时
 楼主| 发表于 2013-11-20 15:45:10 | 显示全部楼层
我試過output('a');
顯示也有問題.
會顯示為0
回复 支持 反对

使用道具 举报

20

主题

75

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
308
金钱
308
注册时间
2013-11-6
在线时间
23 小时
 楼主| 发表于 2013-11-21 09:18:10 | 显示全部楼层
此問題已解決,感謝各位
回复 支持 反对

使用道具 举报

23

主题

292

帖子

0

精华

高级会员

Rank: 4

积分
501
金钱
501
注册时间
2013-9-17
在线时间
17 小时
发表于 2013-12-5 13:15:18 | 显示全部楼层
回复【6楼】sun_shine:
---------------------------------
这个转换 协议怎么搞啊
闷鱼闷闷不乐吃焖鱼
回复 支持 反对

使用道具 举报

23

主题

292

帖子

0

精华

高级会员

Rank: 4

积分
501
金钱
501
注册时间
2013-9-17
在线时间
17 小时
发表于 2013-12-5 13:16:47 | 显示全部楼层
回复【8楼】ChrisLiu1017:
---------------------------------
如何破 接收 ASCII 可以 但是 16进制的 貌似有问题啊  比如 发送 "CALL" 与 “13411111111”
闷鱼闷闷不乐吃焖鱼
回复 支持 反对

使用道具 举报

65

主题

440

帖子

0

精华

高级会员

Rank: 4

积分
782
金钱
782
注册时间
2012-8-29
在线时间
17 小时
发表于 2013-12-6 11:36:07 | 显示全部楼层
回复【9楼】闷鱼:
---------------------------------
查表  ,
人生永远追逐着幻光,但谁把幻光看作幻光,谁便沉入无边的苦海
回复 支持 反对

使用道具 举报

23

主题

292

帖子

0

精华

高级会员

Rank: 4

积分
501
金钱
501
注册时间
2013-9-17
在线时间
17 小时
发表于 2013-12-6 21:50:18 | 显示全部楼层
回复【11楼】sun_shine:
---------------------------------
比如 CSQ 查信号 。。 只要截取 一段信号值  该如何做
闷鱼闷闷不乐吃焖鱼
回复 支持 反对

使用道具 举报

65

主题

440

帖子

0

精华

高级会员

Rank: 4

积分
782
金钱
782
注册时间
2012-8-29
在线时间
17 小时
发表于 2013-12-7 23:12:25 | 显示全部楼层
回复【12楼】闷鱼:
---------------------------------
接收到返回数据存起来 然后判断数据中的特征值,取它后面的数据就是了。其实AT指令返回的数据格式是一样的,每次返回数据都是可以预判的,直接截取就可以了
人生永远追逐着幻光,但谁把幻光看作幻光,谁便沉入无边的苦海
回复 支持 反对

使用道具 举报

23

主题

292

帖子

0

精华

高级会员

Rank: 4

积分
501
金钱
501
注册时间
2013-9-17
在线时间
17 小时
发表于 2013-12-8 16:33:09 | 显示全部楼层
回复【13楼】sun_shine:
---------------------------------
貌似用中断接收数据 的 方法不太可取啊 呵呵  延时 。。
闷鱼闷闷不乐吃焖鱼
回复 支持 反对

使用道具 举报

65

主题

440

帖子

0

精华

高级会员

Rank: 4

积分
782
金钱
782
注册时间
2012-8-29
在线时间
17 小时
发表于 2013-12-9 08:07:34 | 显示全部楼层
回复【14楼】闷鱼:
---------------------------------
没发现 我就是用串口中断写的SIM900 程序
人生永远追逐着幻光,但谁把幻光看作幻光,谁便沉入无边的苦海
回复 支持 反对

使用道具 举报

23

主题

292

帖子

0

精华

高级会员

Rank: 4

积分
501
金钱
501
注册时间
2013-9-17
在线时间
17 小时
发表于 2013-12-9 13:46:24 | 显示全部楼层
回复【15楼】sun_shine:
---------------------------------
中断里面 你是如何 判断数据接收完毕了呢  我用的 0x0d 0x0a 这样子不行的  会丢数据
闷鱼闷闷不乐吃焖鱼
回复 支持 反对

使用道具 举报

65

主题

440

帖子

0

精华

高级会员

Rank: 4

积分
782
金钱
782
注册时间
2012-8-29
在线时间
17 小时
发表于 2013-12-9 15:50:40 | 显示全部楼层
回复【16楼】闷鱼:
---------------------------------
你每条指令后面,返回的数据你是知道的,  直接放进一个大一点的数组就可以了 。AT指令返回的内容 你用16进制的数据看一下  就会发现 0x0d 0x0a判断数据是不行的,一条指令返回的数据可能是两行。  多观察一下返回的数据 ,不用把问题想的太复杂
人生永远追逐着幻光,但谁把幻光看作幻光,谁便沉入无边的苦海
回复 支持 反对

使用道具 举报

23

主题

292

帖子

0

精华

高级会员

Rank: 4

积分
501
金钱
501
注册时间
2013-9-17
在线时间
17 小时
发表于 2013-12-9 19:48:55 | 显示全部楼层
回复【17楼】sun_shine:
---------------------------------
对的 一个可能返回两行或者三行  不是想复杂了 是意识到之前问题的所在了 协议的重新写一个才好 故此有一问 我写好了能用了 在交流 呵呵
闷鱼闷闷不乐吃焖鱼
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-15 16:07

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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