OpenEdv-开源电子网

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

F407进行485通讯的问题

[复制链接]

31

主题

85

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
294
金钱
294
注册时间
2018-5-3
在线时间
69 小时
发表于 2019-3-27 14:38:48 | 显示全部楼层 |阅读模式
5金钱
自己先把voltage_command指令发送到串口上面查看,是没有问题的啊。但是为什么后来没有接收到数据啊   主函数里面的判断len一直等于0.

代码2.jpg
代码1.jpg
QQ截图20190327143437.jpg
QQ截图20190327143411.jpg
协议.jpg

485通信实验 - 副本.zip

5.26 MB, 下载次数: 19

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

使用道具 举报

153

主题

310

帖子

0

精华

高级会员

Rank: 4

积分
673
金钱
673
注册时间
2019-3-26
在线时间
18 小时
发表于 2019-3-27 15:12:58 | 显示全部楼层
http://www.iis7.com/c/90/
回复

使用道具 举报

2

主题

686

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
10996
金钱
10996
注册时间
2014-6-12
在线时间
1046 小时
发表于 2019-3-27 15:49:59 | 显示全部楼层
nenfa-shou.png 软件没有问题查接线与波特率
回复

使用道具 举报

31

主题

85

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
294
金钱
294
注册时间
2018-5-3
在线时间
69 小时
 楼主| 发表于 2019-3-27 15:59:21 | 显示全部楼层
xuyaqi 发表于 2019-3-27 15:49
软件没有问题查接线与波特率

你这是用我的程序去测试的吗?
回复

使用道具 举报

2

主题

686

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
10996
金钱
10996
注册时间
2014-6-12
在线时间
1046 小时
发表于 2019-3-27 16:18:40 | 显示全部楼层
17862984059 发表于 2019-3-27 15:59
你这是用我的程序去测试的吗?

是下载了你的程序测试的
回复

使用道具 举报

3

主题

1155

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7464
金钱
7464
注册时间
2015-1-15
在线时间
1368 小时
发表于 2019-3-27 17:13:59 | 显示全部楼层
推荐楼主这样处理串口数据比较好:
#define cHEADP                                                0
#define cSTATUSP                                        1
#define cADDRP                                                2
#define cLENP                                                3
#define cDATAP                                                4

#define cFRAME_HEAD1                                0xDD
#define cFRAME_HEAD2                                0x77

#define cFRAME_R_STATUS                                0xA5
#define cFRAME_W_STATUS                                0x5A

#define cFRAME_BASE_INFO                        0x03
#define cFRAME_BATTERY_VOLT                        0x04
#define cFRAME_BOARD_VER                        0x05

typedef struct
{
        uint8_t frameFlag;
        uint8_t rx_len;
        uint8_t rx_buf[200];
        uint8_t rx_index;
        uint8_t tx_len;
        uint8_t tx_buf[200];
        uint8_t tx_index;
}CommMsg_Type;

CommMsg_Type Comm_Msg;

void USART1_IRQHandler(void)
{
        uint8_t value = 0;
       
    if(USART1->SR & 0x00000008)
                USART1->SR |= 0x00000008;
   
        if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
        {
                value = USART_ReceiveData(USART1);

                switch( Comm_Msg.rx_index )
                {
                        case cHEADP:                // 帧头
                        {               
                                if(cFRAME_HEAD1 == value)
                                {
                                        Comm_Msg.rx_buf[Comm_Msg.rx_index++] = value;
                                }
                                break;
                        }
                        case cSTATUSP:                // 功能
                        {
                                if(cFRAME_R_STATUS == value || cFRAME_W_STATUS == value)
                                {
                                        Comm_Msg.rx_buf[Comm_Msg.rx_index++] = value;
                                }
                                else
                                {
                                        Comm_Msg.rx_index = 0;
                                }
                                break;
                        }
                        case cADDRP:                // 地址
                        {
                                if(cFRAME_BASE_INFO == value || cFRAME_BATTERY_VOLT == value || cFRAME_BOARD_VER == value)
                                {
                                        Comm_Msg.rx_buf[Comm_Msg.rx_index++] = value;
                                }
                                else
                                {
                                        Comm_Msg.rx_index = 0;
                                }
                                break;
                        }
                        case cLENP:                        // 长度
                        {
                                if(value < sizeof(Comm_Msg.rx_buf)/sizeof(uint8_t))
                                {
                                        Comm_Msg.rx_buf[Comm_Msg.rx_index++] = value;
                                }
                                else
                                {
                                        Comm_Msg.rx_index = 0;
                                }
                                break;
                        }
                        default:
                        {
                                if(Comm_Msg.rx_index >= sizeof(Comm_Msg.rx_buf)/sizeof(uint8_t))
                                {
                                        Comm_Msg.rx_index = 0;
                                }
                                else
                                {
                                        if(Comm_Msg.rx_index >= (Comm_Msg.rx_buf[cLENP] + 6))
                                        {
                                                if(cFRAME_HEAD2 == value)
                                                {
                                                        Comm_Msg.rx_buf[Comm_Msg.rx_index++] = value;
                                                        Comm_Msg.rx_len = Comm_Msg.rx_index;
                                                        Comm_Msg.rx_index = 0;
                                                        Comm_Msg.frameFlag = true;
                                                }
                                                else
                                                {
                                                        Comm_Msg.rx_index = 0;
                                                }
                                        }
                                        else
                                        {
                                                Comm_Msg.rx_buf[Comm_Msg.rx_index++] = value;
                                        }
                                }
                                break;
                        }
                }
        }
       
        if(USART_GetITStatus(USART1, USART_IT_TC) != RESET)
        {
                USART_ClearITPendingBit(USART1, USART_IT_TC);
                if(Comm_Msg.tx_index < (Comm_Msg.tx_len - 1))
                {
                        USART1->DR = Comm_Msg.tx_buf[Comm_Msg.tx_index++];
                }
                else
                {
                        USART1->DR = Comm_Msg.tx_buf[Comm_Msg.tx_index++];
                        Comm_Msg.tx_index = 0;
                        Comm_Msg.tx_len = 0;
                        USART_ITConfig(USART1, USART_IT_TC, DISABLE);
                }
        }
}

static void vComm_Task(void *pvParameters)
{
        // 接收一帧有效数据,处理接收数据
        if(true == Comm_Msg.frameFlag)
        {
                Comm_Msg.frameFlag = false;
                memcpy(Comm_Msg.tx_buf, Comm_Msg.rx_buf, Comm_Msg.rx_len);
                Comm_Msg.tx_len = Comm_Msg.rx_len;
                Comm_Msg.rx_len = 0;
                Comm_Msg.tx_index = 0;
                USART1->DR = Comm_Msg.tx_buf[Comm_Msg.tx_index++];
                USART_ITConfig(USART1, USART_IT_TC, ENABLE);
        }
        gpio_trigger(&gpio_handlers[eLED4]);
}
一分耕耘一分收获。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-16 18:10

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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