二进制数据收发
来源:互联网 发布:花与爱丽丝杀人 知乎 编辑:程序博客网 时间:2024/05/20 20:04
串口通讯程序在大部分情况下都采用二进制数据收发
利用 Read 和 Write 方法, 可发送和接收任意类型的数据。
char a[10];
AnsiString s;
short n;
YbCommDevice1->Write(a,10); //发送字符数组
YbCommDevice1->Write(s.c_str(),s.Length()); //发送字符串
YbCommDevice1->Write(&n,2); //发送一个 16 位的短整数, 先发送低位字节, 后发送高位字节
例(2), 发送结构:
#pragma pack(push,1) //用字节型对齐方式,下面的 TMyStruct 结构是 7 个字节, 否则 TMyStruct 结构是8个字节
typedef struct
{
char a; //字节型变量, 1 个字节
short b; //短整数变量, 2 个字节
long c; //长整数变量, 4 个字节
} TMyStruct;
#pragma pack(pop) //恢复原来的对齐方式
TMyStruct MyStruct; //定义结构变量
YbCommDevice1->Write(&MyStruct,sizeof(TMyStruct));
例(3), 接收数据:
char Buffer[8192]; //定义一个 8kb 缓存
int n = YbCommDevice1->Read(Buffer,8192); //收到 n 个字节, 接收的数据保存到 Buffer 里
例(4), 完整的例子:
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
try
{
YbCommDevice1->PortNo = 1; //COM1
YbCommDevice1->Active = true;
}
catch(Exception &e)
{
ShowMessage("YbCommDevice1: "+e.Message);
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ButtonSet1Click(TObject *Sender)
{
YbCommDevice1->SettingsDialog(this,true);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ButtonSend1Click(TObject *Sender)
{
int nBytes = 0;
char Buffer[1000], *EndPtr;
AnsiString t,s = Edit1->Text.Trim();
while(s.Length()>0)
{
int p = s.Pos(' '); //空格
if(p>0)
{
t = s.SubString(1,p-1);
s = s.SubString(p+1,s.Length()).Trim();
Buffer[nBytes++] = strtol(t.c_str(), &EndPtr, 16); //十六进制字符串转成字节
}
else //还剩下最后一个字节
{
t = s;
s = "";
Buffer[nBytes++] = strtol(t.c_str(), &EndPtr, 16); //十六进制字符串转成字节
}
}
YbCommDevice1->Write(Buffer,nBytes);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
unsigned char Buf[8192]; //收到的字节数不会超过串口缓存的容量, 所以分配一个缓存容量相同的Buf
int n = YbCommDevice1->Read(Buf,8192); //收到 n 个字节
AnsiString s;
for(int i=0; i<n; i++)
s += IntToHex(Buf[i],2) + " ";
s = s.Trim();
if(!s.IsEmpty())
Memo1->Lines->Add(s);
}
//---------------------------------------------------------------------------
- 二进制数据收发
- 串口收发数据时字符、十六进制、二进制格式详细区分
- xmlhttp 收发二进制数据 (Sending and Receiving Binary Data)
- netty 二进制收发
- Ajax--------收发 json 数据
- 串口收发数据
- socket收发数据
- Socket收发数据
- Socket收发数据
- 监控串口数据收发
- SOCKET收发数据报
- SOCKET收发数据问题
- stm32 SPI 收发数据
- USB 收发数据
- USB芯片 收发数据
- bluetooth数据收发
- 串口数据收发问题
- RF收发数据
- HMM模型
- mysql查询
- Visual C++编程命名规则
- Linux 双机HA的功能实现
- 深入分析 Java I/O 的工作机制
- 二进制数据收发
- BSplayer无法加载字幕的简单解决办法
- 谱聚类
- jsp中page基础用法和指令元素page的用法
- hdu 4776 Ants 杭州现场赛G题
- 让EditPlus支持扩展名为sql的文件语法高亮显示
- Heartbeat V2 模块分析
- 常用的排序算法
- EFM32小记----定时器配置为捕获、比较以及PWM输出注意事项