|
|
我查找了很多迪文论坛的程序,工程主体采用的是:【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)使用状态机来实现的,请问我需要注意些什么?或者说有没有相关的例程我可以借来参考?要不就是我不应该使用这种方式来实现?
- 部分程序源码:
- <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;
}
}
}
|
|