迪文科技论坛

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

【提问】关于while(1)程序执行问题

[复制链接]

5

主题

19

回帖

516

积分

高级会员

Rank: 4

积分
516
发表于 2025-6-10 15:33:45 | 显示全部楼层 |阅读模式
我查找了很多迪文论坛的程序,工程主体采用的是:【OS用户核应用】T5L屏串口2、3、4、5的82、83协议C语言 - T5L ASIC开发 - 迪文科技论坛 - Powered by Discuz!
我使用uart2-modbus-ASCII来与下位机通讯。我找了论坛里好多的例程,发现好像没有使用状态机方式的程序。麻烦官方帮我解答一下。

  • 程序设计思路:我想按照状态机的方式来写程序,在Read_0xF00()获取屏幕按键,然后在while(1)来处理程序,主要就是发modbus指令到下位机。实现的是在0~6分钟内下位机两种灯闪烁,6~7分钟中内下位机灯常亮。
  • 现象:我在AmblyProcess函数中的Process_INIT中,如果写了ProcessWorkStatus = Process_WORKONE,modbus就不发送。注释掉ProcessWorkStatus = Process_WORKONE;就能一直发送(因为没有切换状态)。现象感觉是我还没有发完,就切换了状态。
  • 问题:我看了好多程序,好像没有在while(1)使用状态机来实现的,请问我需要注意些什么?或者说有没有相关的例程我可以借来参考?要不就是我不应该使用这种方式来实现?
  • 部分程序源码:



  1. <blockquote>void main(void)
复制代码


void SystemWorkHandle()
{
    switch(SystemWorkStatus)
    {
    case System_IDLE:
        break;
    case System_AMBLY_PROCESS:
        AmblyProcess();
        break;
    case System_MYOPIA_PROCESS:
        MyopiaProcess();
        break;
    case System_LIGHTBRU_PROCESS:
        LightBruProcess();
        break;
    case System_VISSTI_PROCESS:
        VisStiProcess();
        break;
    case System_TRIVIS_SIMU_PER_PROCESS:
    case System_TRIVIS_FUS_PROCESS:
    case System_TRIVIS_STEREO_PROCESS:
        TriVisProcess(SystemWorkStatus);
        break;
    default:
        SystemWorkStatus = System_IDLE;
        break;
    }
}


oid AmblyProcess()
{
    u16 g_data = 0;
                u16 Temp = 0;
    switch(ProcessWorkStatus)
    {
                                case Process_IDLE:
                                {

                                } break;
                                case Process_INIT:
                                {
                                                Temp = Read_Dgus(0x1060);//读亮度
                                                eyemaskBacklight.redlight_brightness = Temp*100;
                                                eyemaskBacklight.greenlight_brightness = Temp*100;
                                                eyemaskBacklight.bluelight_brightness = Temp*100;
                                                eyemaskBacklight.whitelight_brightness = Temp*100;
                                       
                                                Temp = Read_Dgus(0x1080);//读频率
                                                eyemaskBacklight.blink_freq = Temp;
                                       
                                                modBus_master_test.m_address = EYEMASK_BACKLIGHT_Modbus_Address_Def;
                                                ModBus_setRegisters(&modBus_master_test, 0x01, &eyemaskBacklight.redlight_brightness, 4, NULL);
                                                ModBus_Master_loop(&modBus_master_test);
                                                               
                                                timeElapsed = 0;        // 时间累计(ms)
                                                timerCount = 0;  // 中断次数计数
                                                CalculateHalfPeriod(Temp); // 计算初始半周期值
                                                Timer_StartFlag = 1;
                                                timerCount_StartFlag = 1;
                                                ProcessWorkStatus = Process_WORKONE;
                                                printf("T5L_C51\r\n");
                                }
                                break;
                                case Process_WORKONE:    //6min
                                {
                                                if(ledState)        //黄绿亮
                                                {
                                                                if(sendStatusFlag)
                                                                {
                                                                                switch(eye)
                                                                                {
                                                                                case BOTH:
                                                                                                g_data = 0x66;
                                                                                                break;

                                                                                case RIGHT:
                                                                                                g_data = 0x60;
                                                                                                break;

                                                                                case LEFT:
                                                                                                g_data = 0x06;
                                                                                                break;

                                                                                default:
                                                                                                g_data = 0x66;
                                                                                                break;
                                                                                }
                                                                                modBus_master_test.m_address = EYEMASK_BACKLIGHT_Modbus_Address_Def;
                                                                                ModBus_setRegister(&modBus_master_test, 0x00, g_data, NULL);
                                                                                ModBus_Master_loop(&modBus_master_test);
                                                                }
                                                }
                                                else                        //红亮
                                                {
                                                                if(sendStatusFlag)        
                                                                {
                                                                                switch(eye)
                                                                                {
                                                                                case BOTH:
                                                                                                g_data = 0x11;
                                                                                                break;

                                                                                case RIGHT:
                                                                                                g_data = 0x10;
                                                                                                break;

                                                                                case LEFT:
                                                                                                g_data = 0x01;
                                                                                                break;

                                                                                default:
                                                                                                g_data = 0x11;
                                                                                                break;
                                                                                }
                                                                                modBus_master_test.m_address = EYEMASK_BACKLIGHT_Modbus_Address_Def;
                                                                                ModBus_setRegister(&modBus_master_test, 0x00, g_data, NULL);
                                                                                ModBus_Master_loop(&modBus_master_test);
                                                                }
                                                }
                                                sendStatusFlag = 0;
                                                ledState = ~ledState;  // 翻转LED状态
                                }
                                break;
                                case Process_WORKTWO:    //1min-纯白光
                                {
                                                if(sendStatusFlag)
                                                {
                                                                switch(eye)
                                                                {
                                                                case BOTH:
                                                                                g_data = 0x88;
                                                                                break;

                                                                case RIGHT:
                                                                                g_data = 0x80;
                                                                                break;

                                                                case LEFT:
                                                                                g_data = 0x08;
                                                                                break;

                                                                default:
                                                                                g_data = 0x88;
                                                                                break;
                                                                }
                                                                modBus_master_test.m_address = EYEMASK_BACKLIGHT_Modbus_Address_Def;
                                                                ModBus_setRegister(&modBus_master_test, 0x00, g_data, NULL);
                                                                ModBus_Master_loop(&modBus_master_test);
                                                                sendStatusFlag = 0;
                                                }
                                }
                                break;
                                
                                case Process_END:        //关闭灯
                                {
                                                modBus_master_test.m_address = EYEMASK_BACKLIGHT_Modbus_Address_Def;
                                                ModBus_setRegister(&modBus_master_test, 0x00, 0x00, NULL);
                                                ModBus_Master_loop(&modBus_master_test);
//                                                printf("T5L_C51 -%d,%d,%d\r\n",ProcessWorkStatus,ledState,sendStatusFlag);
//                                                                uart_send_byte(2,(u8)(timeElapsed>>24));
//                                                                uart_send_byte(2,(u8)(timeElapsed>>16));
//                                                                uart_send_byte(2,(u8)(timeElapsed>>8));
//                                                                uart_send_byte(2,(u8)timeElapsed);

                                                sendStatusFlag = 0; // 设置状态发送标志
                                                timeElapsed = 0;
                                                SystemWorkStatus = System_IDLE;
                                                ProcessWorkStatus = Process_IDLE;
                                }break;

                                default:
                                {
                                                SystemWorkStatus = System_IDLE;
                                                ProcessWorkStatus = Process_IDLE;
                                }
    }
}
回复

使用道具 举报

0

主题

481

回帖

2895

积分

金牌会员

Rank: 6Rank: 6

积分
2895
发表于 2025-6-11 08:33:25 | 显示全部楼层
这种方式是可以的,至于不发送的bug,可以再检查下发送逻辑,是不是参数影响到了发送的判断,没有进发送语句。
回复

使用道具 举报

5

主题

19

回帖

516

积分

高级会员

Rank: 4

积分
516
 楼主| 发表于 2025-6-17 13:46:19 | 显示全部楼层
程序有问题,修改了之后就可以了。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-4-15 01:25 , Processed in 0.038008 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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