OpenEdv-开源电子网

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

我自己想通过USART发送接收数据实现两个串口之间的通信

[复制链接]

33

主题

310

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
495
金钱
495
注册时间
2016-12-31
在线时间
63 小时
发表于 2017-3-21 10:29:42 | 显示全部楼层 |阅读模式
2金钱
我想通过USART来实现两个开发板之间的通信,但是显示不对,一直显示是:R    RR   RR   
不知道是什么原因,请教一下大家。
主接收显示代码:
main.c

while(1)
        {                 
               
                POINT_COLOR=RED;          
                x=USART3_Scan();
                if(x)
                {
                       
                                       
                        LCD_ShowString(30,170,200,12,12,"correct");       
                        for(i=0;i<USART_RX_STA;i++)
                        {
                               
                                LCD_ShowString(30+i*8,190,200,12,12,(u8*)RX3_Buff[i]);
                               
                        }USART_RX_STA=0;       
                       
                       
                }else
                {
                        LCD_ShowString(30,210,200,12,12,"receive failed");
                }



串口部分:
u8 RX3_Buff[0xff];


int  USART3_Scan(void)
{
        u16 ftemp=0,i;
        ftemp=USART_RX_STA;
        if(ftemp!=0)
        {
                delay_ms(100);
                while(ftemp!=USART_RX_STA)
                {
                        ftemp=USART_RX_STA;
                        delay_ms(100);
                       
                }
                USART_RX_BUF[ftemp]='\n';
                USART_RX_BUF[ftemp+1]='\0';
                for(i=0;i<=ftemp+1;i++)
                {
                        RX3_Buff[i]=USART_RX_BUF[i];
                }
               
                return 1;
        }
       
        return 0;
       
}
       


void USART3_IRQHandler(void)                        //串口3中断服务程序
        {
        u8 Res;
#if SYSTEM_SUPPORT_OS                 //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
        OSIntEnter();   
#endif
        if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)  //接收中断
                {
                        Res =USART_ReceiveData(USART3);        //读取接收到的数据
               
                        if(USART_RX_STA<800)//接收未完成
                        {
                                USART_RX_BUF[USART_RX_STA]=Res;
                                USART_RX_STA++;
                        }
                                 
                }
                USART_ClearITPendingBit(USART3,USART_IT_RXNE);
       
#if SYSTEM_SUPPORT_OS         //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
        OSIntExit();                                                                                           
#endif
}
#endif       




从发送部分:

uint8_t Uart1_Put_Char(unsigned char DataToSend)
{
        TxBuffer[count++] = DataToSend;  
  USART_ITConfig(USART1, USART_IT_TXE, ENABLE);
        return DataToSend;
}


void USART1_IRQHandler(void)                        //串口1中断服务程序
        {
        u8 Res;
#if SYSTEM_SUPPORT_OS                 //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
        OSIntEnter();   
#endif
                if(USART1->SR & USART_IT_ORE)
                {               
                        USART1->SR;
                }
        //发送中断
                if((USART1->SR & (1<<7))&&(USART1->CR1 & USART_CR1_TXEIE))//if(USART_GetITStatus(USART1,USART_IT_TXE)!=RESET)
                {
                        USART1->DR = TxBuffer[TxCounter++]; //写DR清除中断标志
                        if(TxCounter == count)
                        {
                                USART1->CR1 &= ~USART_CR1_TXEIE;                //关闭TXE中断
                                //USART_ITConfig(USART1,USART_IT_TXE,DISABLE);
                        }
               
       
                       
                }
               
#if SYSTEM_SUPPORT_OS         //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
        OSIntExit();                                                                                           
#endif
}


int main(void)
{         
       
        delay_init();                     //延时函数初始化          
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);         //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
        USART1_Init(115200);
       
                                
          while(1)
        {                 
                Uart1_Put_String("Welcome\r\n");
                Uart1_Put_String("to\r\n");

        }
}


最佳答案

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

先搞懂简单的。你现在的能力,还不能写这个代码。 建议学习我们串口实验,学懂了先(现在不要告诉我你学懂了)
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-3-21 10:29:43 | 显示全部楼层
先搞懂简单的。你现在的能力,还不能写这个代码。
建议学习我们串口实验,学懂了先(现在不要告诉我你学懂了)
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

33

主题

310

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
495
金钱
495
注册时间
2016-12-31
在线时间
63 小时
 楼主| 发表于 2017-3-21 10:31:19 | 显示全部楼层
求大神帮解答一下呀,这个弄了好长时间,对那个发送和接收的设置不是很懂,特别是怎样确定接收了多少个字节的数据,然后怎样把接收到的数据取出来
回复

使用道具 举报

3

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
255
金钱
255
注册时间
2014-2-2
在线时间
41 小时
发表于 2017-3-21 17:21:32 | 显示全部楼层
楼主换个靠谱点的TTL转RS232芯片吧
回复

使用道具 举报

33

主题

310

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
495
金钱
495
注册时间
2016-12-31
在线时间
63 小时
 楼主| 发表于 2017-3-23 22:31:19 | 显示全部楼层
正点原子 发表于 2017-3-21 10:29
先搞懂简单的。你现在的能力,还不能写这个代码。
建议学习我们串口实验,学懂了先(现在不要告诉我你学懂 ...

今天中午再学了一遍原子哥的例程,这次真的看懂了,就是需要判断是否接受到了0x0d和0x0a这两个字符
回复

使用道具 举报

33

主题

310

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
495
金钱
495
注册时间
2016-12-31
在线时间
63 小时
 楼主| 发表于 2017-3-23 22:33:32 | 显示全部楼层
godsend 发表于 2017-3-21 17:21
楼主换个靠谱点的TTL转RS232芯片吧

谢谢,我用的是那个开发板,应该没问题吧
回复

使用道具 举报

33

主题

310

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
495
金钱
495
注册时间
2016-12-31
在线时间
63 小时
 楼主| 发表于 2017-3-23 22:39:11 | 显示全部楼层
godsend 发表于 2017-3-21 17:21
楼主换个靠谱点的TTL转RS232芯片吧

串口部分:
u8 RX3_Buff[0xff];


int  USART3_Scan(void)
{
        u16 ftemp=0,i;
        ftemp=USART_RX_STA;
        if(ftemp!=0)
        {
                delay_ms(100);
                while(ftemp!=USART_RX_STA)
                {
                        ftemp=USART_RX_STA;
                        delay_ms(100);
                        
                }
                USART_RX_BUF[ftemp]='\n';
                USART_RX_BUF[ftemp+1]='\0';
                for(i=0;i<=ftemp+1;i++)
                {
                        RX3_Buff=USART_RX_BUF;
                }
               
                return 1;
        }
        
        return 0;
        
}特别是对这一段代码不是很理解,能帮我解答一下吗
回复

使用道具 举报

33

主题

310

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
495
金钱
495
注册时间
2016-12-31
在线时间
63 小时
 楼主| 发表于 2017-3-26 09:09:52 | 显示全部楼层
yklstudent 发表于 2017-3-26 08:32
楼主数据中出现0x0d,0x0a就傻眼了

为什么呀,你好能帮忙解释一下吗,谢谢
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-8-22 20:31

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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