工业控制中的远程通信相关,为何自己会忽然停止? 200 分

HuWenjin 2003-04-18 03:07:17
出现问题都有半年多了,这次是真的必需要解决的了
我已在每年函数前做了程序运行记录,停止时的记录如下:

2003年 4月16日 10:10: 4: 50 : 站点名: 调度室 类型号: 1 动作: SendCmdToRemote 开始执行
2003年 4月16日 10:10: 4: 50 : 站点名: 调度室 类型号: 1 动作: 发送遥测量B帧 24 个,共分 12 帧
2003年 4月16日 10:10: 4: 50 : 站点名: 调度室 类型号: 1 动作: 遥测量B帧已准备完成
2003年 4月16日 10:10: 4: 50 : 站点名: 调度室 类型号: 1 动作: 发送准备好的<B>帧数据
2003年 4月16日 10:10: 4:100 : ======> 串口号: 1 要求发送84,地址718e24,发送缓冲0,接收缓冲0


在这里就停了,下面是记录这段记录的代码:

strLogMsg.Format("要求发送%d,地址%x,发送缓冲%d,接收缓冲%d",dwBytesToWrite,lpCommand,ComStat.cbOutQue,ComStat.cbInQue);
WriteRunLog(strLogMsg);
fWriteStat = WriteFile( IoInfoData.idComDev , lpCommand, dwBytesToWrite,
&dwBytesWritten,NULL) ;

其中文件打开时的方法:

IoInfoData.idComDev = CreateFile(szPort,GENERIC_READ|GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
NULL,
NULL);

没有使用 OverLapped 参数,是直接发送完成才退出的。



查了两个星期了,定们到这里,我实在是没有半法解释这个问题了,可是问题还要解决
我出差中,有没有人也遇到这样的问题?大家讨论一下,可能会是什么原因? 和硬件上设置是不是有相关的地方?



...全文
90 70 打赏 收藏 转发到动态 举报
写回复
用AI写文章
70 条回复
切换为时间正序
请发表友善的回复…
发表回复
HuWenjin 2003-04-24
  • 打赏
  • 举报
回复
IoInfoData.idComDev = CreateFile(szPort,GENERIC_READ|GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
NULL,
NULL);


我试过的,这样才能在 NT 内核下使用,但是参数中少了一个 FILE_FLAG_OVERLAPPED,
所以在


fWriteStat = WriteFile( IoInfoData.idComDev , lpCommand, dwBytesToWrite,
&dwBytesWritten,&IoInfoData.osWrite ) ;


这个 &ioInfoData.osWrite 实际可能没有使用

我想我应改成:


IoInfoData.idComDev = CreateFile(szPort,GENERIC_READ|GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,
NULL);

不过现在我已回了武汉公司,不在现场了,没有办法试了:(



头应给我加工资了:) 都 深夜 1:00 了,我还在卖命啊! 程序员:想说爱你不容易!
nbb01 2003-04-24
  • 打赏
  • 举报
回复
CPU占用率很低,一般在3%--7%之间,其中还包括电力系统通信协议的解析及各种后续处理;我的类中每个串口有自己的环型缓冲,写到自己的缓冲后,启动TX事件后台发射。每个串口一个线程,实际是半双工方式,因为我怀疑三线程的资源消耗会有点高。要求等待返回的命令,需要你自己程序中做合理的逻辑控制,如果做的细致的话,你可以实现各种命令的优先级。
由于通道限制,我的通信速率一般为300、600、1200bps,低速通信,个别的高点,估计在高速下CPU占用率也一样的。
HuWenjin 2003-04-24
  • 打赏
  • 举报
回复
唉!用了几年的类了,这时候出错,真是头痛


我原来在我的串口类中是使用了线程,一个串口对一个,可是后来感觉速度太慢了,就去掉了

改来改去的,反到改乱了,现在想好好整理了

问一下,30 个串口开 30 个线程, CPU 占用率如何?发送数据和接收数据如何处理?在发送查询命令的同时,如何加入遥控命令?


我的系统结构看来要做一个大修了
nbb01 2003-04-24
  • 打赏
  • 举报
回复
还有,如果发射的数据量很大、很频繁的话,自己的类中一定要做缓冲,要求发送时先写到自己的缓冲中,开启串口的TX事件,用TX事件后台驱动发射,别用WriteFile那么去死写。

nbb01 2003-04-24
  • 打赏
  • 举报
回复
大家所谓的异步方式,就是overlapped了吧,windows的异步I/O模型,文字上有点混淆了。
按照一个老外的说法,一个真正的全双工串口通信,应该有三个线程:接收、发射、控制,
实际中我们可以偷点懒,每个串口一个线程,这样实际工作在半双工状态,高速通信下会有点问题,我的通信程序就是这样写的,30个串口,最少有30个线程,外面还有看门狗线程。

看你的头文件,似乎并没有启动线程,那么,你
SetCommMask(IoInfoData.idComDev,EV_RXFLAG)做什么呢?RX事件在哪里处理呢?
另外,设置了事件驱动,读超时设置也不恰当,ReadIntervalTimeout应该为MAXDWORD,

还有,串口驱动的缓冲设置可能有点小,可能你设的4096,比系统缺省的还小。

我觉得你这个类应该全面改写。关于串口通信,清华大学出版社很早出的一本书《Windows95
通信编程》写的很好,可以找来看看,另外,codeproject上有几个封装的很好的类,可以参考。
HuWenjin 2003-04-24
  • 打赏
  • 举报
回复
IoInfoData.idComDev = CreateFile(szPort,GENERIC_READ|GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,
NULL);


改成这样的,在 2000 系统下就可以用了,真想不通我原来为什么要把 FILE_FLAG_OVERLAPPED 去掉

如果真是因为这个参数的问题,那我真的要疯了啊!
patricklee01 2003-04-24
  • 打赏
  • 举报
回复
up
HuWenjin 2003-04-24
  • 打赏
  • 举报
回复
yaven365(天涯网客) : 你的问题我帮你解答了,去看看吧,我想我说的没有错,你应可以看到效果了。

还有,下次不要再说如何设定 crc16 校验了
HuWenjin 2003-04-24
  • 打赏
  • 举报
回复
yaven365(天涯网客) : 可能你还没有明白我说的问题所在

writefile 没有理由的运行几个小时后停了,不发了

您所说的多线程是什么意思?一个串口对应一个线程? 30 个串口就开30个线程对应?


您说的校验是哪里的校验?是初始化串口时的 无校验 还是对数据做的校验? 所有的数据都做了校验,初始化时跟据下位机不同可能是有 n 方式的


大家说的异步是什么就是 overlapped 交迭的 这个词吗?我的感觉是后台操作而已,什么叫异步? 你发一次,我发一次,我的程序正的是同步的吗? 两边同时可以发?不清楚了
我觉得没有 overlapped 参数, writefile 会到发送完成后才退出就是了,别的好像没有什么不同啊


湖涂了哟


fangcheng : 谢谢,那个站点早都看过了,现在是解决一个其怪的问题了
fangcheng 2003-04-24
  • 打赏
  • 举报
回复
到这里去看看吧,简直是串口大全

http://www.gjwtech.com/
yaven365 2003-04-24
  • 打赏
  • 举报
回复
2000必须用异步通信,本人又同样问题,大家看看去吧

http://expert.csdn.net/Expert/topic/1694/1694405.xml?temp=.5977289
yaven365 2003-04-24
  • 打赏
  • 举报
回复
你即没有用异步通信,数据量传输又这么大

,也没有校验,我觉得出问题是必然的,你可以同时采取如下方式:1.异步通信(我上边采用的就是异步通信).2.多线城

3.牺牲效率,增加正确性(每次发送数据后,延时50毫秒Sleep(50);)。
4.加上校验
HuWenjin 2003-04-24
  • 打赏
  • 举报
回复
真是年轻有为啊,我都 26 了,有些东西还不如你清楚,惭愧啊

不过,我个人觉得你有机会还是要上上大学,就是办个脱产自修也好,在理论知识上可以更深入一点
再拿个文凭什么的,工作也好找一些,要往长远了看啊,


只是一点个人意见
AthlonxpX86 2003-04-24
  • 打赏
  • 举报
回复
我准备上班了,我前几天才过的19岁生日啊(我认识的编程上的朋友最小的都比我大2岁,气死我了,我收的徒弟都比我大................)因为搞这些没考上大学,其实计算机编程不是我的强项,我主要喜欢搞偏硬一些的,比如串口并口上的程序,单片机之类,另外就是驱动程序开发PCI的驱动程序基本上可以搞定了,USB的驱动还不会做,因为这些,所以我才申请了硬件系统版的版主,现在和朋友搞数据库开发,搞的我一头雾水,C#里面的东西都不会用,极的我的大哥们都不愿和我说话了,
HuWenjin 2003-04-24
  • 打赏
  • 举报
回复
不是吧,快高考了,那你年龄也不大了,你在上班还是上学? 不管怎样你的编程还是有点过硬啊
我都上班几年了,现在和她谈何时结婚的事呢。她说也想学编程,可是从来没有来过,我没办法,就拿她的号玩一下,没有想到 嘿嘿..露馅了


我刚才打了个电话到站里,两个站这几天运行很好,看来很有可能是操作系统的问题了
那边我已从98改成 2000 了

希望不会再出问题...
AthlonxpX86 2003-04-24
  • 打赏
  • 举报
回复
to Saimen(爱已随你而去...小茜):没有吧,那片贴子居然有这么多人知道,
Saimen(爱已随你而去...小茜) linyao(小茜) 通过你们的名字好想知道些什么东西了....................
另外还有一种说不出来的感觉,因为我女友的名字叫茜茜,不过我更喜欢叫她沙子,哈哈,其实我和她很久没有联系了,她就快高考了,希望她能考个好大学,以后能找到自己真正的幸福,其实我们的结局肯定是以可以预料的悲剧告终,我们是不可能的,...............不想再想这些事情了,还是天天搞技术比较快乐
HuWenjin 2003-04-24
  • 打赏
  • 举报
回复
我倒,露馅了 :-)

大家不要误会,小茜是我女朋友,就是不来这里,我急啊,就用她的号上来说了一句,嘿嘿,没想到

CSDN 一次只让一个人登录 ... 下次不敢了也


晚上就放分...
linyao 2003-04-24
  • 打赏
  • 举报
回复
呵呵~~ 你总算来这里看看我了

我可是想找借口回去看你啊,可是工作还要做啊。这不...我还在想办法呢!


看到没有,这里有好多热心人,知道我们做程序员的都是好人了吧。以后常来这里看看
你不是说想学 VB 吗,有什么问题就去发贴子啊


想我了吧,过几天还回去好不好 :)
linyao 2003-04-24
  • 打赏
  • 举报
回复
你的鬼问题还没有解决啊!不会是想找借口回来看我吧 xixi
HuWenjin 2003-04-24
  • 打赏
  • 举报
回复
一滴水: 说得不错,问一下你女朋友怎么样了? 我也看了那篇煸情的
《给我程序员男友的一封信》

http://expert.csdn.net/Expert/topic/1398/1398188.xml?temp=.5818903



那边我已换了操作系统,再看两天吧,如果不行就把overlapped 加上再看看了


系统结构以后有空再改吧
加载更多回复(50)

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧