迪文科技论坛

 找回密码
 立即注册
搜索
查看: 62|回复: 2

【提问】串口4通过BT数组进行modbus通信发生数据的时候如何

[复制链接]

7

主题

23

回帖

232

积分

中级会员

Rank: 3Rank: 3

积分
232
发表于 前天 11:29 | 显示全部楼层 |阅读模式
void Sys_Timer2_isr() interrupt 5 // 1MS
{
        TF2 = 0; // 清除定时器2的中断标志位
        if (TimVal < 255)
                TimVal++;
        SysTick_RTC++;
        if (T_O4 > 0)
                T_O4--;
}
//========================
void uart4_Risr() interrupt 11 // 串口4中断接收
{
        R_u4[R_CN4] = SBUF4_RX;
        SCON4R &= 0xFE;
        R_OD4 = 1;
        R_CN4++;
        T_O4 = 10;
}
//========================
void uart4_Tisr() interrupt 10
{
        SCON4T &= 0xFE;
        Busy4 = 0;
}
按理是在中断处理里面该吧?我尝试在发送中断里面先关闭接收中断再打开,或者关闭总中断,都没有效果;
具体情况是我在使用过程中输入数据随机成功,经常输入之后又变回原来的数据,看了slave的指令记录,写指令是正确写进去了,但是对应的数据却是未改变前的数据,想请问如何让串口4暂停接收数据呢


回复

使用道具 举报

0

主题

243

回帖

2005

积分

金牌会员

Rank: 6Rank: 6

积分
2005
发表于 前天 18:34 | 显示全部楼层
使用这个代码,UI工程和cfg需要勾选自动上传
void Sw_Data_Send() // 变量改变后关闭modbus读2秒
{
    u16 Va = Read_Dgus(0x0f00);
    u16 V1 = Read_Dgus(0x0f01);
    u8 i = 0;
    if (((u8)(Va >> 8)) == 0x5A) // 检测到数值变化,关闭读指令
    {
        for (i = 0; i < C_N; i++)
        {
            if (BT[2 + 12 * i] == 3)
                BT[0 + 12 * i] = 0; // 关闭的指令
        }
        Write_Dgus(0x0f00, 0);
        Write_Dgus(0x0f01, 0);
        T_NUMBER_2 = 1000; // 时长
        Flog_Read = 1;
    }
    if (T_NUMBER_2 == 0 && Flog_Read == 1) // 到0,开启读指令
    {
        for (i = 0; i < C_N; i++)
        {
            if (BT[2 + 12 * i] == 3)
                BT[0 + 12 * i] = 0x5A; // 重新赋值5a
        }
        Flog_Read = 0;
    }
}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

7

主题

23

回帖

232

积分

中级会员

Rank: 3Rank: 3

积分
232
 楼主| 发表于 昨天 19:37 | 显示全部楼层
紫狐 发表于 2025-5-6 18:34
使用这个代码,UI工程和cfg需要勾选自动上传
void Sw_Data_Send() // 变量改变后关闭modbus读2秒
{

思路可行,改善挺大,感谢
回复

使用道具 举报

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

本版积分规则

QQ|Archiver|手机版|小黑屋|迪文科技论坛 ( 京ICP备05033781号-1 )

GMT+8, 2025-5-8 15:07 , Processed in 0.028345 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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