首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

来了,关于串口通信的,代码不懂写

2013-06-25 
来求救了,关于串口通信的,代码不懂写导师不负责任我就只好求助网络了,测力数据采集系统,从单片机读取数据,

来求救了,关于串口通信的,代码不懂写
导师不负责任我就只好求助网络了,测力数据采集系统,从单片机读取数据,显示到表格控件中。,
“打开串口”,每10秒从单片机读三个数据(日期,通道一,通道二,后两个是测力数据,就是纯数字),显示在表格控件中,逐行增加地显示,“关闭串口“就不再读取数据,保存按钮我已经编好了,直接读表格里面的数据进行保存的,所以关键是不知道串口那些怎么读
来了,关于串口通信的,代码不懂写 串口通信 单片机
[解决办法]
http://blog.sina.com.cn/s/blog_5c52ae1b0100c9dc.html
[解决办法]
想来快的就使用MSCOMM组件
首先是串口通信的基本设置和打开串口
在MSComm1Comm事件中接收
//---------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "dpj2.h"
//---------------------------------------
#pragma package(smart_init)
#pragma link "MSCommLib_OCX"
#pragma resource "*.dfm"
TForm1 *Form1;
int choosenum;
int cnum=0;
//---------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
     if(MSComm1->PortOpen!=true)
     {
       MSComm1->CommPort=1; //设置通信端口号为COM1
       MSComm1->InputMode=1; //设置串口传入数据为二进制
       MSComm1->Settings = "9600,n,8,1"; //设置串口参数
       MSComm1->InBufferSize=512;
       MSComm1->OutBufferSize=1024;
       MSComm1->RThreshold=1;
       MSComm1->SThreshold=1;
       MSComm1->PortOpen=true; //打开通信端口1
       choosenum=1;
       GroupBox2->Enabled=false; //使循环计数框失效
       GroupBox3->Enabled=false; //使控制指示灯框失效
     }
     else
     {
       ShowMessage("串口已经打开");
       return;
     }
}
//---------------------------------------

void __fastcall TForm1::Button6Click(TObject *Sender)
{
     MSComm1->PortOpen=false;
     Close();
}
//---------------------------------------

void TForm1::test(String temp)//发送十六进制字符串
{
     //TODO: Add your source code here
     String SendStr=temp; //定义发送字符串
     BYTE buff[8];
     int nLength=SendStr.Length()/2;
     //十六进制字符串转换成二进制字节数组


     HexToBin(SendStr.c_str(),buff,nLength);
     int n=nLength-1;
     Variant Txbuff;
     Txbuff=VarArrayCreate(OPENARRAY(int,(0,n)),varByte);
     for(int i=0;i<nLength;i++)Txbuff.PutElement(buff[i],i);
     MSComm1->Output=Txbuff;//发送十六进制数据

}
//------------------------

//以下为测试单片机的程序
//发送字符串“Hello”
//05 57 01 03 00 48 04 1C    发送'H' ASCII码"48"
//05 57 01 04 00 65 04 36    发送'e' ASCII码"65"
//05 57 01 05 00 6C 04 3E    发送'l' ASCII码"6c"
//05 57 01 06 00 6C 04 3D    发送'l' ASCII码"6c"
//05 57 01 07 00 6F 04 3F    发送'o' ASCII码"6f"
//05 52 01 03 00 01 04 50    读取地址03H中的值
void __fastcall TForm1::Button1Click(TObject *Sender)
{
     test("055701030048041C");
     Sleep(100);
     test("0557010400650436");
     Sleep(100);
     test("05570105006C043E");
     Sleep(100);
     test("05570106006C043D");
     Sleep(100);
     test("05570107006F043F");
     Sleep(100);
     test("0552010300010450");
}
//---------------------------------------

//判断发送字符串是否正确
//返回 06 01 00 4F 03 4B  返回 'O'(4F) 代表'OK'正确
//返回 06 01 00 45 03 41  返回 'E'(45) 代表'ERROR'错误
//每发送一次指令,触发下面事件,返回字符串
void __fastcall TForm1::MSComm1Comm(TObject *Sender)
{
    String temp;
    byte buff[100];//声明一个存储接收数据的缓冲区
    int ByteNum;//收到的字节数
    OleVariant RxBuff;
    if(MSComm1->CommEvent==comEvReceive)//表示接收缓冲区内有字符
    {
       if(MSComm1->InBufferCount>0)
       {
          RxBuff=MSComm1->Input;//接收数据
          ByteNum=RxBuff.ArrayHighBound();
          for(int i=0;i<=ByteNum;i++)buff[i]=RxBuff.GetElement(i);
          temp=IntToHex(buff[3],2);
          if(temp=="4F")
          {
             Edit1->Text="OK!";
             GroupBox2->Enabled=true; //使循环计数框有效
             GroupBox3->Enabled=true; //使控制指示灯框有效
             Button1->Enabled=false;
          }
          if(temp=="45")
          {


             Edit1->Text="Error!";
             Button1->Enabled=true;
          }
       }
    }
}
//---------------------------------------

//开始计数
void __fastcall TForm1::Button2Click(TObject *Sender)
{
    Timer1->Enabled=true;
}
//---------------------------------------

void __fastcall TForm1::Button3Click(TObject *Sender)
{
    Timer1->Enabled=false;
}
//---------------------------------------

//05 57 01 00 00 00 04 57  数码管显示00
//05 57 01 00 00 01 04 56  数码管显示01
//05 57 01 00 00 02 04 55  数码管显示02
//05 57 01 00 00 03 04 54  数码管显示03
//05 57 01 00 00 04 04 53  数码管显示04
//05 57 01 00 00 05 04 52  数码管显示05
//05 57 01 00 00 06 04 51  数码管显示06
//05 57 01 00 00 07 04 50  数码管显示07
//05 57 01 00 00 08 04 5F  数码管显示08
//05 57 01 00 00 09 04 5E  数码管显示09
//05 57 01 00 00 0A 04 5D  数码管显示10
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
    String data1,data2,data3;
    int t;
    cnum=cnum+1;
    if(cnum>10)cnum=0;
    data1="0x"+IntToStr(cnum);
    Edit2->Text=cnum;
    t=0x05^0x57^0x01^0x00^0x00^data1^0x04;//十六进制整数异或运算
    data1=IntToHex(cnum,2);
    data2=IntToHex(t,2);
    data3="0557010000"+data1+"04"+data2;
    test(data3);
}
//---------------------------------------

void __fastcall TForm1::RadioButton1Click(TObject *Sender)
{
    choosenum=1;
}
//---------------------------------------

void __fastcall TForm1::RadioButton2Click(TObject *Sender)
{
    choosenum=2;
}
//---------------------------------------

//打开指定的指示灯
//发送下面指令
//05 57 01 02 00 01 04 54  1号灯亮 蜂鸣器响
//05 57 01 01 00 01 04 57  2号灯亮 蜂鸣器响
void __fastcall TForm1::Button4Click(TObject *Sender)
{
    if(choosenum==1)test("0557010200010454");
    if(choosenum==2)test("0557010100010457");
}
//---------------------------------------

//关闭指定的指示灯
//发送下面指令
//05 57 01 02 00 00 04 55  1号灯灭 蜂鸣器停止响
//05 57 01 01 00 00 04 56  2号灯灭 蜂鸣器停止响
void __fastcall TForm1::Button5Click(TObject *Sender)
{
    if(choosenum==1)test("0557010200000455");
    if(choosenum==2)test("0557010100000456");


}
//---------------------------------------

热点排行