读书人

各位大侠小弟我在做一个485的项目

发布时间: 2013-08-10 21:14:06 作者: rapoo

各位大侠,我在做一个485的项目,遇到一个问题,请有实际经验的兄台给予指点
上位机与下位机是主从式通讯方式,下位机由三块仪表构成,上位机采用轮询发送下位机地址的方式,地址的发送放在了一个时间间隔为2000ms的timer定时器内,具体思路上首先发送1#号机地址,然后执行一个延时函数500ms等待(这段时间间隔用来处理串口的serialPort_DataReceived事件以及UI的更新),之后再发送2#机地址,执行延时函数,……。我程序大体是这样写的,但是在调试的时候 刚运行可以收到1#号仪表的数据,之后就再收不到数了,我怀疑是不是在执行500ms延时函数的时候阻塞了线程,才导致这样,不知道这个怀疑对不对,我的上位机采用C#编写,定时器及延时函数如下:请高手给予指导。



private void timerDraw_Tick(object sender, EventArgs e)
{

if (!serialPort.IsOpen)
{
openPort();
}
string strCMD = "020300040001C5F8";//1号机地址
SendAsHex(strCMD);//十六进制发送
delayMs(500);//延时500ms

string strCMD2 = "030300040001C429";//2号机地址
SendAsHex(strCMD2);
delayMs(500);

string strCMD2 = "030300040001C429";//3号机地址
SendAsHex(strCMD2);
delayMs(500);
}

这个是延时函数

private static void delayMs(int DelayTime)
{
int time = Environment.TickCount;
while (true)
{
if (Environment.TickCount - time >= DelayTime)
{
break;
}
Application.DoEvents();


//Thread.Sleep(10);
}
}

通信 485 轮询
[解决办法]
CSDN 有专门的 C# 板块。

另外,485总线一般使用 485 TO 232 方式供上位机访问,485 总线两个地址访问间隔至少 5ms ,一般建议15ms以上。

总的来说和 232 差不多,只是多了地址概念。
[解决办法]
我也是自动化设备上位机软件从业者,我虽然用的是C++,但是在思路上我想说点什么。

先明确一点,一个上位机与3个下位机进行通讯,且只是上位机主控建立通讯,首先确定,这是不是一个单双工模式,换而言之通讯线路上的数据同一时间只能从上位机到下位机或者下位机到上位机,我假定是(大多数设备通讯都是)。
明确上面这点那么可以想象出通讯的过程,上位机发读取1#设备数据的命令数据到1#设备,1#设备接收到命令返回数据给上位机而且它无响应,以此类推。
我用串口都自己调用API,我不用控件,我正常的做法是上位机发完命令,延时等待一段时间后,查看串口输入缓冲区中的字节书是否满足通讯协议中的规定,满足则读取数据按照通讯协议解析出数据,若不满足则继续等待,可以设置一个等待时间限制作为通讯是否妥善连接的判定;若数据正确返回(或者超出等待时间)则发2#读取数据命令,如上处理。

兄台你的读取程序类似于盲发,甚至你自己也不知道等500ms是刚好,是不够,还是太多。应为从硬件上已经决定了读三个仪表的数据是一个过程顺序,不会是同步操作(类似多线程),那么为什么不先确保1#返回有效数据后再发2#读取命令呢。

由于谁也确定不了读一次数据需要多长时间(软件角度硬件角度都会消耗时间,不好确认),那么我建议你建立一个线程,如我上面所说,专门处理读取数据,1#读完读2#然后读3#,周而复始,每次都可以保证通讯的正常。

读书人网 >C++ Builder

热点推荐