TEL:0755-32882616   公司简介 - 委托交易 - 收费标准 - 汇款方式 - 联系我们 - 免责申明 - 站点地图

设为桌面图标 | 设为首页 | 加入收藏夹 | IC型号 | 黑名单

   当前位置: IC37首页 > 博士 > 热帖推荐

東土工业以太网交换机在石油化工中的解决方案


用户名:chencheng
注册时间:2011-9-18 16:00:00
楼主  发布时间:2013-3-13 17:18:07    点击率:3933

東土工业以太网交换机在石油化工中的解决方案

我的硬件是STC11F04XE的uart连接MAX485,共4套连接在总线上,线长40cm。其中三个单片机处于接受状态,一个处于发送状态。进过反复试验发现:如果无间隔连续发送4个字节数据,那么只能收到前2个字节。如果间隔1秒或更长时间连续发送,无论多少字节都能正确接收。又用PC机串口转485与一个单片机点对点通信,单片机程序为中断收到4个字节数据后,转发该4字节数据(无间隔连续发送)。用串口调试助手,一次发送一个字节,发送4次,能收到转发回来的同样4字节数据。鼠标快速连续点击4次发送,单片机不能转发,再点击2-3次发送,才能收到4字节转发过来的数据。若一次发送4字节数据,则发送2次即共发送8字节数据,才收到4字节转发回来的数据,且是两次发送的前2字节。

上述现象,调试无数遍都如此。更换过不同渠道的MAX485以及不同种类的单片机,现象依旧。是485就不能连续接收?不应该!头大,不知该如何调试?


用户名:chunyang
注册时间:2011-9-19 0:45:00
1楼  发布时间:2013-3-13 17:18:07
注意485接口芯片在收发转换后要延时至少1mS后再送数据,另外注意硬件电路结构。

用户名:chencheng
注册时间:2011-9-19 21:23:00
2楼  发布时间:2013-3-13 17:18:07
我的STC11F04XE单片机程序如下,中断接收数据,主程序中判断收到4个字节数据就转发。
PC串口转485通过MAX485与单片机UART连接。调试助手发送单个字节,发送4次,能正确收到转发回来的数据。一次发送4个字节,则必须发送两次,才能收到转发回来的4个字节数据,不过该数据是两次发送的前2个字节。
用示波器观察MAX485的数据接收端RI,波形很好。无论发送单字节还是4字节,波形都正确!问题应该在程序。请各位帮助我分析一下程序,我可能陷入某个误区。
void Serial0_ISR() interrupt 4
{
unsigned char temp;
EA=0; //disable interrupt
if (RI)
{
RI=0;
temp=SBUF; //读取串口接收字节
RxData[RxCounter]=temp; //接收数据,4字节
RxCounter++;
}
}
//-------------------------------------------------------------------
void SendChar(unsigned char temp)
{
SBUF=temp;
while(TI==0);
TI=0;
}
/********************************************************************/
void main (void)
{
unsigned char i;
ini8051();
delayxms(200); //延时一段时间
// CLRWDT(); //start watchdog
RxCounter =0; //串行口接收数据计数器
RS485T1R0=0; //485接收
start3:
RS485T1R0=0; //485接收
ES=1; //enable UART interrupt
EA=1; //enable interrupt

if (RxCounter <4) goto noRevDa;//一帧数据,4字节

//命令协议解析处理
ES=0; //disable UART interrupt
RxCounter=0;

//转发485收到的数据
RS485T1R0=1; //485发送
_nop_(); _nop_(); _nop_(); _nop_();
// for (i=5;i>0;--i) delayxms(200); //delay 1 seconds
for (i=0;i<4;i++)
{
SendChar(RxData[i]);
}
ES=1; //enable UART interrupt  

RS485T1R0=0; //485接收
for (i=0;i<3;i++) //LED闪烁3次,调试观察
{
LED1=0; delayxms(200);
LED1=1; delayxms(200);
}

noRevDa:
// ES=1; //enable UART interrupt
EA=1; //enable interrupt
// RS485T1R0=1; //485发送
LED1=0;  //LED亮灭,调试观察
for (i=10;i>0;--i) delayxms(200); //delay 1 seconds
LED1=1;
for (i=10;i>0;--i) delayxms(200); //delay 1 seconds
_nop_();
goto start3;
} // end of main

用户名:xyz769
注册时间:2011-9-20 21:36:00
3楼  发布时间:2013-3-13 17:18:07
本帖最后由 xyz769 于 2011-9-20 21:37 编辑

从LZ程序风格看,以前应该是搞汇编的吧?

程序不完整,RxCounter 你怎么定义的?是不是被keil过度优化了?

用户名:chencheng
注册时间:2011-9-22 20:02:00
4楼  发布时间:2013-3-13 17:18:07
问题解决了。原因是中断服务程序中只有EA=0;没有EA=1。这样,主程序延时阶段就只能响应一次接收中断。
热门型号:
UCC5950 UDZSTE-172.7B ULN2003ADRG3 UPA1524H UPA1802GR-9JG-E1 UPB587G-E1 UPC1215V UPC1458G2-E2 UPC1477C UPC2748T-E3