|
用的是BCB6.0,串口控件VICTOR1.3.5。波形显示为IOCOMP控件。
小弟做了个单片机数据采集系统的上位机程序,用的是串口,设置的波特率是9600,用的是16位的AD,单片机分高低字节发送数据给上位机,然后上位机程序将高低字节重新组合再转换为整型数,计算得到电压值。
采集的时候发现当速度比较低的时候,1s接收个几十个数据!这时候能把高字节跟低字节重新合并成16位数,然后再计算得到电压值。当单片机发送速度比较快时,大概设置为每秒钟1000之后,只能接收到数据,不能把数据重新整合,计算!
这是工作时候的图片
![](http://cache.amobbs.com/bbs_upload782111/files_40/ourdev_643102JZU6FM.jpg)
(原文件名:1.jpg)
下面是我的程序:
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
const BufSize = 4096;
unsigned char Buffer[BufSize];
int nBytes = 0;
AnsiString s,l,m;
//victor控件接收数据程序
while((nBytes=YbCommDevice1->ReadPackage(Buffer,BufSize))>0)
for(int i=0; i<nBytes; i++)
{
s += IntToHex(Buffer,2) + " ";
l += IntToHex(Buffer[nBytes-i-1],2);
}
s = s.Trim();
if(!s.IsEmpty())
{
Memo1->Lines->Add(s); //显示从串口接收到的原始数据
Buffer[BufSize]=0;
}
int StrLen;
int temp;
double volt;
AnsiString voltvalue;
StrLen = l.Length();
if(StrLen == 4)
{
m = (String( "0x")+ l ).ToInt();
Memo2->Lines->Add(m); //显示经过整合,转换后的整型数
temp = StrToInt(m);
//计算电压
if (temp>=0 && temp<=32767)
{
volt = ((double)temp/32768)*10;
}
else if(temp>32767 && temp<=65535)
{
temp = temp-65536;
volt =((double)temp/32768)*10;
}
else
volt = 0;
voltvalue = FloatToStrF( volt,ffFixed,7,5);
Memo3->Lines->Add(voltvalue); //显示计算得到的电压值
}
int i;
iPlot1->Channel[0]->AddXY(i,volt); //显示波形
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|