关于串口的简单问题,回答三个问题中的一个就给分,50分奉送,不够加贴再加,全部家当压上(50分)

  • 主题发起人 主题发起人 zhaokaien
  • 开始时间 开始时间
Z

zhaokaien

Unregistered / Unconfirmed
GUEST, unregistred user!
问题1:
我用控件或api函数写程序控串口的时候都遇到了接收缓冲区和发送缓冲区的问题,就是不管你把缓冲区设置多少,调试的时候都不能看到设置缓冲区大小的影响,有那位高手能讲讲关于串口发送过程中缓冲区的相关知识(我用api函数写的串口发送大文件的软件里面,先用setupcomm函数设置串口接收发送缓冲区都是1byte,发送一个字节一个字节发送,调试的时候却发现comstat结构体中的cbinque数字是8,之后的数不定,有时是30多,有时40多,怎么会是这样呢,缓冲区不是只有1吗,而cbinque不是接收缓冲区中未被readfile处理过的字节数吗,急需高手指教)
问题2:
在串口通信过程中,怎样让接收端通知发送端什么时候该发,什么时候停止,(只使用串口的3个引脚,最好用api例程说明,或者使用mscomm),我知道是用握手,能不能有高手用简单的例程示范一下
问题3:
问一个与串口无关的问题,怎么样用delphi编写控制window‘运行’的程序,比如编程实现
“在运行里输入regv32 c:/windows/system/mscomm.ocx”类似的进行注册控件的功能
 
我的qq:99292746
邮箱:xyzw-0016@163.com
在线等各位高手!!!
 
问题3:
uses ShellAPI;
winexec(application)
shellexecute(application)
// 执行应用程序 
procedure ExecFile(fName: string;
param: string);
begin
ShellExecute(GetDesktopWindow(), 'open', PChar(fName), PChar(param), '', SW_SHOWDEFAULT);
end;

// 测试:启动记事本
procedure TForm1.Button1Click(Sender: TObject);
begin
ExecFile('c:/Windows/NotePad.exe', '');
end;
 
本人刚刚学delphi不过2天时间,我的老师就叫我做一个东西.做一个数据库和delphi 的连接问题.要求如下:
<1>建立一学生数据表
<2>然后用ado与这个学生表连接起来
<3>再用delphi里面Button控件添加4个控件分别是确定,保存,撤消,删除来控制学生数据表.
后天就要教了,好心的人给发邮件啊.他什么都没有教我连数据库怎么连接都还不知道怎么做啊
 
非常感谢dey-999,结帖时20分赠送,笑纳
1,2问题回答者,结帖时加贴加分,谢谢各位!!
 
请cf83325朋友如果要问问题的话请自己开贴好吗,谢谢了,尊重别人也是尊重自己
 
用api干嘛.那不好控制,delphi 有spcomm 控件.与mscomm差不多.spcomm控件就是用api写的.挺简单的.如果是三线通讯.都会有自己制定的协议.根据协议就好办了.
 
to 任重至远
能不能 针对问题2用spcomm写个答案
 
问题2:
事实上,对于这种情况,为了保证程序能够顺利获取,一般是在发送端建立发送区,根据你的协议,上位机轮巡时发出终端需要开始发送数据的命令,这样一旦数据变化,且通过你的校验之后,你就可以使用终端数据了
问题1:
你用API+线程的话,不管终端发的是什么,累加字符串变量A.根据你自己的协议,结果数据字符串可以由开始字符+返回命令字+终端地址+数据+校验+结束字符组成,收到符合条件的字符串之后再清除A:='',收到乱码或者超出你的约定字符串长度而没有数据信息则A:='',然后继续...
 
非常感谢dey-999的指教,你的答案给了我很多的关于协议制定方面的知识,这是我非常需要的,真诚感谢!结贴时会奉上小分,笑纳!
但是我的疑惑不止这些,因为我对问题里提出的一些现象很疑惑,希望有高手亲自试一下,是不是像我说的那样,然后能不能给我点解释,我是想弄懂原理,为什么会出现这样的现象,我不理解串口的两个缓冲区到底是怎么样运作的,整个过程能不能有人描述一下,谢谢大家,希望和大家一起研究研究!
 
问题1:cbinque是接收readfile处理之前收到的字节数,你缓冲区定义的太小,数据丢失,但cbinque存放的没有处理过的数目没有丢失。如果你缓冲区比较小,应该确认发送的速度小于你处理的速度。
 
to wang_junfan:
谢谢指教,我明白cbinque记录的readfile未处理过的数字,但是请问
1.为什么,不过将缓冲区设置为多大,第一次发送后 ,接收到的cbinque都是8
2.你所说的数据丢失问题并不存在啊,我用该方法编写的串口传送图片的程序,传送图片时一切正常,没有丢失数据的现象(我是用两台机子对接,三根线那种,传送图片成功)
我想请问是不是串口本身有什么机制,丢失的数据他会自动重发
 
如何用usb读取硬件来电通的号码?
 
jn-liz, 如果你要问问题请自己开贴好吗??谢谢了
 
这个问题还没有解决呀?楼主,解决了QQ号里告诉我一声哦!!
 
没问题,我刚钢看了网上的一些说法,有人说在
取cbinque之前sleep一下,得到的字节数就不是8了,我还没有试验,不知道是否
我的qq99292746欢迎大家来和我讨论,
串口传图片的软件我实现了(双机对接传送成功),有需要的call我
 
在每次处理前调用clearcommerror函数确保串口状态正确, 缓冲区一般设置1024足够了,
 
问题1:
从你的表述来看,是串口接收不定长数据,这和我开发的一个实时采集排队机的数据差不多。解决不定长的数据接收。首先参数设置如下:
MSComm1.CommPort := 1;//设置端口1
MSComm1.Settings := '9600,n,8,1';//9600波特率,无校验,8位数据位,1位停止位
MSComm1.InputLen := 0;//读取缓冲区全部内容(
MSComm1.InBufferCount := 0;// 清除接收缓冲区
MSComm1.OutBufferCount:=0;// 清除发送缓冲区
MSComm1.RThreshold := 1;//设置接收1个字节产生OnComm 事件
//MSComm1.InputMode := comInputModeText;//文本方式
MSComm1.InputMode := comInputModeBinary;//二进制方式
MSComm1.PortOpen := true;//打开端口
其他参数默认设置就可以
要注意的是MSComm1.RThreshold := 1,只要缓冲区有数据(〉=1),就触发oncomm事件。
(这里要切记,不是MSComm1.RThreshold 设置为多少,buffer就是多少,他们是没直接联系的,比如MSComm1.RThreshold设置为8,并不代表缓冲区buffer就是8,buffer里的数据可以是64,32不定长的)
然后再oncomm事件里要做如下处理
case MSComm1.CommEvent of
comEvReceive: //串行接收事件处理
begin
j:= MSComm1.InBufferCount;
MSComm1.InputLen:=j;
buffer := MSComm1.Input;
这段的意思就是取出实际buffer的内容,并知道buffer的长度,以便下面编程对buffer里的数据进行处理
for i := 0 to j - 1do
..............
呵呵,加分吧,
这可是我花了几天时间才弄清楚的!!
做实时采集不定长数据真是麻烦,不加分也要到http://www.5iask.com
去看看,里面的这方面资料会对你有帮助的
 
to wangwa
首先非常感谢你的热心指教,结贴时会有小分相赠
但是我认为我得问题1你没有完全理解,MScomm控件我使用过,也用它做过东西,它的很多属性我明白,问题时,我得问题1里的现象是为什么,最近看网上资料,有同道中人遇到了和我一样的问题,其中有人说在clearcomerr前加sleep,就可以改变cbinque 的值,我试验了一下,的确如此,但是现在的问题是,我将接收和发送缓冲区都设置成1,但是并没有如他所说的发生数据丢失的情况,也就是说,现在接收缓冲区里有几十个字节(cbinque显示的),但是实际设置接收缓冲区只有1字节,那么多出来的那么多字节到底放到那里去了,如果是丢了,为什么我传送图片还能成功,是否串口里还隐藏着硬件握手协议,即丢失了重传的机制,
另外我设置dcb的xon,xoff字符后,试图接收数据后再发送xon,xoff字符进行流控制,但是根本不起作用,xon,xoff到底是自动发送还是需要程序员手动发送,有没有人能给出例程来,这可以作为问题2的答案
 
另外,wangwa
你的网站我去了,说实话,比较乱,强烈建议使用css对他进行规划
 
后退
顶部