RS-232采集数据 急!!!!(100分)

  • 主题发起人 主题发起人 robin_kana
  • 开始时间 开始时间
R

robin_kana

Unregistered / Unconfirmed
GUEST, unregistred user!
本菜鸟需要大家的帮助,请大伙帮忙出出方案,谢谢!!!
公司新做了一台设备,采用的是自动控制。当这台设备的运行周期为六个小时,在这六个小时中每五分钟会记录一次数据,所有的数据都记录在单片机上。当需要了解设备运行的性能时就得通过这些数据来说明,我就想用Delphi做一个人机界面,把单片机上所记录的数据通过RS-232串口通讯端传送到计算机上。并通过用Delphi所编写的程序把它整理出来。
大伙帮我出个方案或提一些可取性的意见,谢谢。
 
怎么无人关注啊?[:(]
我真的需要大家的帮助啊。
 
这个不难啊
只要你知道下位机是用什么格式存贮数据的
通过RS232把它读出来之后进行还原
显示
一般还要存入数据库
 
Mike1234567890
谢谢,能和你保持QQ联系吗?
QQ:21439022
 
已经加你了
 
procedure TCommThread.Execute;
var
dwErrorFlags,dwLength : DWORD;
ComStat : PComStat;
fReadStat : Boolean;
InChar : Char;
AbIn : String;
XX,YY : double; //经度、纬度
VID : string; //车号
begin
while Connected do begin
GetMem(ComStat,SizeOf(TComStat));
ClearCommError(CommHandle, dwErrorFlags, ComStat);
if (dwErrorFlags > 0) then begin
PurgeComm(CommHandle,(PURGE_RXABORT and PURGE_RXCLEAR));
// return 0;
end;
dwLength := ComStat.cbInQue;
if (dwLength>0) then begin
fReadStat := ReadFile(CommHandle, InChar, 1,dwLength, nil);
if (fReadStat) then begin
if (InChar <> Chr(13)) and (Length(abIn) < MAXBLOCK+5 ) then
AbIn := AbIn + InChar
else begin
{接收完毕,开始截取经纬度信息}
CommForm.DealInPackage(Trim(AbIn));
AbIn := '';
end;
end;//if (fReadStat>0){
end; //if (dwLength>0){
FreeMem(ComStat);
end;{while}
end;

constructor TCommThread.Create;
begin
FreeOnTerminate := TRUE;

inherited Create(FALSE); //Createsuspended = false
end;

....

procedure TCommForm.InitializeComPort;
var
CommTimeOut : TCOMMTIMEOUTS;
DCB : TDCB;
fRetVal : Boolean;
begin
ShowStatus('同端口' + ComboBox2.Text + '连接中...');
// CommHandle := CreateFile(PChar(ComboBox2.Text),(GENERIC_READ and GENERIC_WRITE),0,nil,OPEN_EXISTING,FILE_FLAG_OVERLAPPED ,0);
CommHandle := CreateFile(PChar(ComboBox2.Text),(GENERIC_READ),0,nil,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL and FILE_FLAG_OVERLAPPED,0);

if CommHandle = INVALID_HANDLE_VALUE then begin
ShowStatus('连接端口' + ComboBox2.Text + '失败');
Exit;
end;

SetCommMask(CommHandle, EV_RXCHAR ) ;

SetupComm(CommHandle, 4096, 4096) ;

PurgeComm(CommHandle, PURGE_TXABORT and PURGE_RXABORT and PURGE_TXCLEAR and PURGE_RXCLEAR ) ;

ShowStatus('已同端口 '+ ComboBox2.Text + ' 连接!');

// set up for overlapped I/O
CommTimeOut.ReadIntervalTimeout := MAXDWORD;
CommTimeOut.ReadTotalTimeoutMultiplier := 0;
CommTimeOut.ReadTotalTimeoutConstant := 1000;
CommTimeOut.WriteTotalTimeoutMultiplier := Trunc(2*CBR_9600/StrToInt(ComboBox3.Text));
CommTimeOut.WriteTotalTimeoutConstant := 0 ;

SetCommTimeouts(CommHandle, CommTimeOut);
//Set port
GetCommState(CommHandle,DCB);
DCB.DCBlength := SizeOf(TDCB);
//波特率
DCB.BaudRate := StrToInt(ComboBox3.Text);

//字节位长度
if RadioButton4.Checked then
DCB.ByteSize := 7
else
DCB.ByteSize := 8;

{校验, EVENPARITY Even
MARKPARITY Mark
NOPARITY No parity
ODDPARITY Odd
}
if RadioButton1.Checked then
DCB.Parity := NOPARITY //无
else if RadioButton1.Checked then
DCB.Parity := ODDPARITY //奇
else
DCB.Parity := EVENPARITY;//偶

{ //停止位
ONESTOPBIT 1 stop bit
ONE5STOPBITS 1.5 stop bits
TWOSTOPBITS 2 stop bits
}
if RadioButton6.Checked then
DCB.StopBits := ONESTOPBIT
else if RadioButton7.Checked then
DCB.StopBits := ONE5STOPBITS
else
DCB.StopBits := TWOSTOPBITS;

fRetVal := SetCommState(CommHandle, DCB);

if (fRetVal) then begin
Connected := TRUE;
//显示端口已经连接
MainForm.ToolButton3.ImageIndex := 14;
try
CommThread := TCommThread.Create;
except
Connected := FALSE;
CloseHandle(CommHandle);
fRetVal := FALSE;
ShowStatus('线程建立失败');
Exit;
end;
//连接串口后模拟失效
SetConnectType(0);
CommThread.Priority := tpNormal;
end
else begin
Connected := FALSE;
CloseHandle(CommHandle);
end;
end;
 
用spcomm就可以方便的操作串口了,关键是要了解数据传输协议阿
 
用MSCOMM控件就可以,不需要第三方控件,我也是用这个做产品的.
 
用MSComm就可以了,关键是你要知道下位机用什么协义,或是用什么指令.数据的还原定义.
 
后退
顶部