Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2350449
  • 博文数量: 816
  • 博客积分: 10000
  • 博客等级: 上将
  • 技术积分: 5010
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-17 17:57
文章分类

全部博文(816)

文章存档

2011年(1)

2008年(815)

分类:

2008-12-17 18:00:22

你的数据帧我理解是:
①延时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---------------------

阅读(1462) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~