|
楼主 |
发表于 2014-9-26 10:21:24
|
显示全部楼层
测试是否总线冲突是否如此:故障时单独卸下传感器或者控制板,看总线是否在不断电情况下恢复,是吗。
这是通讯部分代码,您看发送程序是否和你的程序有一样的不妥,可是大部分都是直接调用freemodbus库的
主程序
//==============================================================================
//主函数
//==============================================================================
void main( void )
{
// variables
u8t addr;
u8t i;
eMBErrorCode eStatus;
DelayMS(30); //上电稳定
asm("sim"); // 关全局中断
Init_HW();
TIM4_IER = 0x01;//允许中断
TIM4_EGR = 0x01;//允许溢出中断
TIM4_PSCR = 0x07;//16M/128=125000;
TIM4_ARR = 0xff;//125000/255=488;
TIM4_CNTR = 0x00;
TIM4_CR1 = 0x01;
GPIO_int ();
I2c_Init(); //initializes uC-ports for I2C
Ht1621_Init(); //initializes LCD
asm("rim"); // 开全局中断
for(i=0;i<3;i++)
{
addr = PE_IDR&0x20;
DevNo = PC_IDR;
DevNo = ~((addr>>5)|DevNo);
DelayMS(1);
}
DelayMS(50);
IWDG_Init(); //开看门狗
s=1;
eStatus = eMBInit(MB_RTU, DevNo, 0, 9600, MB_PAR_NONE );
// Enable the Modbus Protocol Stack. */
eStatus = eMBEnable( );
for( ;; )
{
(void)eMBPoll();
/* Here we simply count the number of poll cycles. */
if(s)
{
get_status();
s=0;
//显示温湿度
if(disk_temp > 99)
{
DISK_TAB[0] = disk_tab1[disk_temp%1000/100];
}
DISK_TAB[1] = disk_tab2[(disk_temp%100)/10];
DISK_TAB[2] = disk_tab2[disk_temp%10];
DISK_TAB[3] = disk_tab1[disk_humi%1000/100];
DISK_TAB[4] = disk_tab2[(disk_humi%100)/10];
DISK_TAB[5] = disk_tab2[disk_humi%10];
Ht1621WrAllData(0,DISK_TAB,6);
}
DelayMS(500);
IWDG_KR = 0xAA;
}
}
//==============================================================================
#pragma vector=0x19
__interrupt void TIM4_OVR_UIF(void)
//==============================================================================
{
// TIM1_ClearFlag(TIM1_FLAG_UPDATE);
TIM4_SR = 0;//清除标志位
n++;
n%=750;//1s-2s的时候置位标志位
if(n==0)
{
s=1;
}
}
通讯程序
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|