你的数据帧我理解是:
①延时3字节传输时间作为帧的首尾识别(例如9600bps为3ms),此期间不能发送数据
②帧的开始是设备地址(1字节),然后是功能号(1字节),数据(根据功能号定),CRC16(2字节)
数据发送成功的关键首先要了解:
①CRC采用哪个标准?CRC16还是CRC-CCITT-16?
②数据格式的确定:究竟有无奇偶校验?波特率是多少?
我会写一个演示程序的,不过还不清楚上面说的格式。
控件的主要BUG还有不能访问 超过 COM9 以上的端口,现在已经解决,还准备修改一些其它的问题
(不是串口控件,而是控件的附属功能,如CRC校验和其它方面的)
我还想增加数据包的处理能力,这只是设想,原来的数据包是格式的,但在处理硬件方面经常有无格式数据包。
我想增加无格式的数据包,靠时间决定的数据包,如果超过一段时间没有数据,
就会认为之前的收到的数据在一个数据包内。既然是自己编的控件,就要有自己的特色。
控件里面现在已经包含了二进制文件处理、CRC校验等功能,进程间共享内存等,只是未公开。
--------------------next---------------------
//---------------------------------------------------------------------------
#include
#pragma hdrstop
#include "UnitTestMain.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "YbCommDevice"
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
try
{
YbCommDevice1->PortNo = 1; //COM1
YbCommDevice1->Baud = TYbCommDevice::br9600;
YbCommDevice1->Active = true;
}
catch(Exception &e)
{
if(!YbCommDevice1->SettingsDialog(this,true))
Application->Terminate();
}
}
//---------------------------------------------------------------------------
void GenCrc16(unsigned __int16 &c, void *p, int n)
{
for(int k=0; k {
unsigned __int16 b=((unsigned char*)p)[k];
for(int i=0; i<8; i++)
{
c = ((b^c) & 0x0001) ? (c>>1)^0xa001 : (c>>1);
b>>=1;
}
}
}
//---------------------------------------------------------------------------
AnsiString BufToHexStr(unsigned char *p, int n)
{
AnsiString s;
for(int i=0; i {
if(i)s+=" ";
s+=AnsiString().sprintf("%02X",p[i]);
}
return s;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
//停止并取消所有串口正在进行的读写工作
YbCommDevice1->PurgeWrite();
YbCommDevice1->PurgeRead();
const BufSize = 256;
unsigned short WordAddr = 0x0001, nWords = 0x0001;
unsigned char SendBuf[BufSize],ReceiveBuf[BufSize];
unsigned short crc = 0xffff; //CRC初始值
int nRead, nSend = 0;
SendBuf[nSend++] = 0x01; //device address
SendBuf[nSend++] = 0x03; //function number
SendBuf[nSend++] = WordAddr>>8; //word addr. msb
SendBuf[nSend++] = WordAddr; //word addr. lsb
SendBuf[nSend++] = nWords>>8; //number of words msb
SendBuf[nSend++] = nWords; //number of words lsb
GenCrc16(crc,SendBuf,nSend); //nSend bytes
SendBuf[nSend++] = crc>>8; //crc msb
SendBuf[nSend++] = crc; //crc lsb
YbCommDevice1->Write(SendBuf,nSend);
Sleep(30+nWords*1000/960); //8 bytes frame + 3 bytes eot + receive data
nRead = YbCommDevice1->Read(ReceiveBuf,BufSize);
if(nRead)
Memo1->Lines->Add(BufToHexStr(ReceiveBuf,nRead));
else
Memo1->Lines->Add("Timeout!");
}
//---------------------------------------------------------------------------
--------------------next---------------------
阅读(1455) | 评论(0) | 转发(0) |