delphi中串口通讯的问题 小弟初学delphi,现在用道一个条码扫描设备通过com口联结,用delphi通过哪个东东可以读到com进来的数据,谢谢 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 给个地址吧,google现在用不成了 借宝地一用楼上的各位哥哥,我的MSCOMM怎么老装不上呀,只好用SPCOM 查查资料,就用api写,可以在一个线程里处理,我写过一个,晚上回去找给你! to sduzjw(幼儿园大班) 我刚才试了一下,在component->import activeX control中插入mscomm32.ocx就可以在面板ActiveX中找到了. 但是我的还不行,是这样的,我的串口上接了一个手持激光扫描设备,接com口的那种,现在接上了.可程序无法读出数据,基本这个控件的执行步骤也大概就是这个样子吧1.portopen=true2.然后就可以在oncom事件里key代码了吧,我在oncom事件里key了些代码,设置了中断,发现程序根本都没往这里运行,郁闷,谁知道这是怎么回事 虽然结贴了还是把我以前写的给你个参考吧。Unit CommThread;InterfaceUses Windows, Classes, SysUtils, Graphics, Controls, Forms, Dialogs, ComCtrls, ExtCtrls;Type TThreadParam = Record SusPended: Boolean; BaulSpeed: integer; Port: Byte; Parity: Boolean; StopBit: byte; StartBit: Byte; SB: TStatusBar; LEDs: Array[1..25] Of TShape; End;Type TReadThread = Class(TThread) Private { Private declarations } hComm: THandle; Port: integer; FErr: Boolean; FPortDescription: String; FShape: Array[1..25] Of TShape; FSB: TStatusBar; cc: TCOMMCONFIG; Data: String; Procedure ReadPort; //读取串行端口数据 Procedure UpdateUI; Protected Procedure Execute; Override; Public Constructor Create(ThdPrm: TThreadParam); End;ImplementationConstructor TReadThread.Create(ThdPrm: TThreadParam);Var i: integer;Begin Port := thdprm.Port; FSB := thdprm.SB; For i := 1 To 25 Do Begin FShape[i] := thdPrm.LEDs[i]; End; FreeOnTerminate := True; Inherited Create(ThdPrm.Suspended);End;Procedure TReadThread.Execute;Var PortToOpen: String;Begin PortToOpen := 'COM' + inttostr(Port); // 选择所要打开的COM hComm := CreateFile(PChar(PortToOpen), GENERIC_READ Or GENERIC_WRITE, 0, Nil, OPEN_EXISTING, 0, 0); // 打开COM If (hComm = INVALID_HANDLE_VALUE) Then Begin //如果COM 未打开 FErr := True; FPortDescription := '打开端口错误!'; End Else Begin FErr := False; FPortDescription := '打开端口成功'; GetCommState(hComm, cc.dcb); // 得知目前COM 的状态 cc.dcb.BaudRate := CBR_9600; // 设置波特率为9600 cc.dcb.ByteSize := 8; //字节为 8 bit cc.dcb.Parity := NOPARITY; // Parity 为 None cc.dcb.StopBits := ONESTOPBIT; // 1 个Stop bit If Not SetCommState(hComm, cc.dcb) Then Begin // 设置COM 的状态 Ferr := True; FPortDescription := FPortDescription + ',设置错误!'; CloseHandle(hComm); //关闭通信端口 End Else Begin FErr := False; FPortDescription := FPortDescription + ',设置成功'; While Not Terminated Do Begin Synchronize(ReadPort); //刚才所定义的读取数据函数 End; Synchronize(UpdateUI); End; End;End;//读取串行端口的程序放在这里Procedure TReadThread.ReadPort;Var i: integer; inbuff: Array[0..29] Of Char; nBytesRead, dwEvent, dwError: LongWORD; cs: TCOMSTAT; Rights, Emptys, Errs: integer;Const RightColor = clBlue; ErrorColor = clRed; EmptyColor = clWhite;Begin Rights := 0; Emptys := 0; Errs := 0; If (hComm = INVALID_HANDLE_VALUE) Then Begin Fsb.Panels[3].Text := FPortDescription; Terminate; //先判断是否已打开通信端口 Exit; End Else Begin Fsb.Panels[3].Text := FPortDescription; ClearCommError(hComm, dwError, @CS); //取得状态 ReadFile(hComm, inbuff, cs.cbInQue, nBytesRead, Nil); // 接收COM 的数据 //串行在读取数据后,会自动将缓冲区中已被读取的数据清除掉 If cs.cbInQue = 0 Then exit; // 数据是否大于我们所准备的Buffer If cs.cbInQue <> sizeof(inbuff) Then Begin PurgeComm(hComm, PURGE_RXCLEAR); // 清除COM 数据 exit; End; Data := Copy(inbuff, 1, cs.cbInQue); //取出数据 For i := 1 To 25 Do Begin If (UpperCase(Data[i]) = 'Y') Then Begin FShape[i].Brush.Color := RightColor; Rights := Rights + 1; End Else If (UpperCase(Data[i]) = 'N') Then Begin FShape[i].Brush.Color := EmptyColor; Emptys := Emptys + 1; End Else If (UpperCase(Data[i]) = 'E') Then Begin FShape[i].Brush.Color := ErrorColor; Errs := Errs + 1; End; End; Fsb.Panels[0].Text := '正确:' + IntTostr(Rights); fsb.Panels[1].Text := '空槽:' + IntTostr(Emptys); fsb.Panels[2].Text := '错误:' + IntTostr(Errs); Fsb.Panels[3].Text := FPortDescription; Fsb.Panels[4].Text := '数据:' + Data; End;End;Procedure TReadThread.UpdateUI;Begin Fsb.Panels[0].Text := '正确:' + IntTostr(0); fsb.Panels[1].Text := '空槽:' + IntTostr(0); fsb.Panels[2].Text := '错误:' + IntTostr(0); Fsb.Panels[3].Text := ''; Fsb.Panels[4].Text := '数据:' + Data;End;End. Delphi2009和C++Builder2009是一个东西吗? 50分求高手指点修改代码~锐化.jpg.jpeg.ico.dcm格式等 如果实现光标一直停留在一个输入框? 请问各位大侠,怎么使用DBGridEh控件啊?急!在线等.... 控件太多怎么办?急啊 挑战各位高手,看看有谁的网传模块比我的性能好!!! Rave中怎样实现自定义打印预览????? 如何给panel加上滚动条? 如何将图片存到SQL SERVER中? 在做三层分布式系统的过程中;如何实现应用程序服务器和数据库的分离; 怎样更新查询结果? TMSCOMM哪里有?
楼上的各位哥哥,我的MSCOMM怎么老装不上呀,只好用SPCOM
1.portopen=true
2.然后就可以在oncom事件里key代码了吧,
我在oncom事件里key了些代码,设置了中断,发现程序根本都没往这里运行,郁闷,谁知道这是怎么回事
Unit CommThread;InterfaceUses
Windows, Classes, SysUtils, Graphics, Controls, Forms,
Dialogs, ComCtrls, ExtCtrls;
Type
TThreadParam = Record
SusPended: Boolean;
BaulSpeed: integer;
Port: Byte;
Parity: Boolean;
StopBit: byte;
StartBit: Byte;
SB: TStatusBar;
LEDs: Array[1..25] Of TShape;
End;Type
TReadThread = Class(TThread)
Private
{ Private declarations }
hComm: THandle;
Port: integer;
FErr: Boolean;
FPortDescription: String;
FShape: Array[1..25] Of TShape;
FSB: TStatusBar;
cc: TCOMMCONFIG;
Data: String;
Procedure ReadPort; //读取串行端口数据
Procedure UpdateUI;
Protected
Procedure Execute; Override;
Public
Constructor Create(ThdPrm: TThreadParam);
End;ImplementationConstructor TReadThread.Create(ThdPrm: TThreadParam);
Var
i: integer;
Begin
Port := thdprm.Port;
FSB := thdprm.SB;
For i := 1 To 25 Do
Begin
FShape[i] := thdPrm.LEDs[i];
End;
FreeOnTerminate := True;
Inherited Create(ThdPrm.Suspended);
End;Procedure TReadThread.Execute;
Var
PortToOpen: String;
Begin
PortToOpen := 'COM' + inttostr(Port); // 选择所要打开的COM
hComm := CreateFile(PChar(PortToOpen), GENERIC_READ Or GENERIC_WRITE,
0, Nil, OPEN_EXISTING, 0, 0); // 打开COM
If (hComm = INVALID_HANDLE_VALUE) Then
Begin //如果COM 未打开
FErr := True;
FPortDescription := '打开端口错误!';
End
Else
Begin
FErr := False;
FPortDescription := '打开端口成功';
GetCommState(hComm, cc.dcb); // 得知目前COM 的状态
cc.dcb.BaudRate := CBR_9600; // 设置波特率为9600
cc.dcb.ByteSize := 8; //字节为 8 bit
cc.dcb.Parity := NOPARITY; // Parity 为 None
cc.dcb.StopBits := ONESTOPBIT; // 1 个Stop bit
If Not SetCommState(hComm, cc.dcb) Then
Begin // 设置COM 的状态
Ferr := True;
FPortDescription := FPortDescription + ',设置错误!';
CloseHandle(hComm); //关闭通信端口
End
Else
Begin
FErr := False;
FPortDescription := FPortDescription + ',设置成功';
While Not Terminated Do
Begin
Synchronize(ReadPort); //刚才所定义的读取数据函数
End;
Synchronize(UpdateUI);
End;
End;End;//读取串行端口的程序放在这里Procedure TReadThread.ReadPort;
Var
i: integer;
inbuff: Array[0..29] Of Char;
nBytesRead, dwEvent, dwError: LongWORD;
cs: TCOMSTAT;
Rights, Emptys, Errs: integer;
Const
RightColor = clBlue;
ErrorColor = clRed;
EmptyColor = clWhite;
Begin
Rights := 0;
Emptys := 0;
Errs := 0;
If (hComm = INVALID_HANDLE_VALUE) Then
Begin
Fsb.Panels[3].Text := FPortDescription;
Terminate; //先判断是否已打开通信端口
Exit;
End
Else
Begin
Fsb.Panels[3].Text := FPortDescription;
ClearCommError(hComm, dwError, @CS); //取得状态
ReadFile(hComm, inbuff, cs.cbInQue, nBytesRead, Nil); // 接收COM 的数据
//串行在读取数据后,会自动将缓冲区中已被读取的数据清除掉
If cs.cbInQue = 0 Then exit;
// 数据是否大于我们所准备的Buffer
If cs.cbInQue <> sizeof(inbuff) Then
Begin
PurgeComm(hComm, PURGE_RXCLEAR); // 清除COM 数据
exit;
End;
Data := Copy(inbuff, 1, cs.cbInQue); //取出数据
For i := 1 To 25 Do
Begin
If (UpperCase(Data[i]) = 'Y') Then
Begin
FShape[i].Brush.Color := RightColor;
Rights := Rights + 1;
End
Else
If (UpperCase(Data[i]) = 'N') Then
Begin
FShape[i].Brush.Color := EmptyColor;
Emptys := Emptys + 1;
End
Else
If (UpperCase(Data[i]) = 'E') Then
Begin
FShape[i].Brush.Color := ErrorColor;
Errs := Errs + 1;
End;
End;
Fsb.Panels[0].Text := '正确:' + IntTostr(Rights);
fsb.Panels[1].Text := '空槽:' + IntTostr(Emptys);
fsb.Panels[2].Text := '错误:' + IntTostr(Errs);
Fsb.Panels[3].Text := FPortDescription;
Fsb.Panels[4].Text := '数据:' + Data;
End;
End;Procedure TReadThread.UpdateUI;
Begin
Fsb.Panels[0].Text := '正确:' + IntTostr(0);
fsb.Panels[1].Text := '空槽:' + IntTostr(0);
fsb.Panels[2].Text := '错误:' + IntTostr(0);
Fsb.Panels[3].Text := '';
Fsb.Panels[4].Text := '数据:' + Data;
End;End.