friendljy 发表于 2008-8-20 10:32:33

用BCB写的串口通讯。使用API函数,照着例子敲上去的,懒的敲的可以下来直接复制。

没有写过上位机,上午没事照着一个从坛里下的PDF的教程写了一点。那个PDF是扫描版的,无法复制,所以就调了一下,有需要的朋友可以直接复制了。只实现了简单的发送盒接收功能。
http://cache.amobbs.com/bbs_upload782111/files_10/ourdev_384397.JPG
(原文件名:未命名.JPG)

BCB的源文件。
点击此处下载 ourdev_384398.rar(文件大小:624K) (原文件名:com.rar)


主要代码:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "SUIButton"
#pragma link "SUIForm"
#pragma link "SUIGroupBox"
#pragma link "SUIImagePanel"
#pragma link "SUIMemo"
#pragma link "SUIRadioGroup"
#pragma resource "*.dfm"
TForm1 *Form1;
HANDLE hComm;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::suitempbtOpencomClick(TObject *Sender)
{
    char *ComNo;
    DCB dcb;
    String Temp;
    Temp = "COM" + IntToStr(RadioGroupComselect->ItemIndex + 1);
    ComNo = Temp.c_str();
    hComm = CreateFile(ComNo,GENERIC_READ | GENERIC_WRITE,
            0,NULL,OPEN_EXISTING,0,0);
    if(hComm == INVALID_HANDLE_VALUE)
    {
      MessageBox(0,"打开端口失败","Comm Error",MB_OK);
      return;
    }
    GetCommState(hComm,&dcb);
    dcb.BaudRate = CBR_9600;
    dcb.ByteSize = 8;
    dcb.Parity = NOPARITY;
    dcb.StopBits = ONESTOPBIT;
    if(!SetCommState(hComm, &dcb))
    {
      MessageBox(0, "通信设置错误" ,"Set Error", MB_OK);
      CloseHandle(hComm);
      return;
    }
    Shape1->Brush->Color = clRed;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::suitempbtExitClick(TObject *Sender)
{
    if(hComm != INVALID_HANDLE_VALUE)
      CloseHandle(hComm);
    exit(EXIT_SUCCESS);            
}
//---------------------------------------------------------------------------
void __fastcall TForm1::suitempbtTransmitClick(TObject *Sender)
{
    String Temp;
    char *SendData;
    int ln;
    unsigned long lrc,BS;
    if(hComm == 0)
      return;
    Temp = MemoSend->Text;
    SendData = Temp.c_str();
    BS = Temp.Length();
    WriteFile(hComm,SendData,BS,&lrc,NULL);      
}
//---------------------------------------------------------------------------
void __fastcall TForm1::suitempbtReceiveClick(TObject *Sender)
{
    String Temp;
    char inbuff;
    DWORD nBytesRead,dwEvent,dwError;
    COMSTAT cs;
    ClearCommError(hComm, &dwError, &cs);
    if(cs.cbInQue > sizeof(inbuff))
    {
      PurgeComm(hComm, PURGE_RXCLEAR);
      return;
    }
    ReadFile(hComm,inbuff,cs.cbInQue,&nBytesRead,NULL);
    inbuff = '\0';
    MemoReceive->Text = inbuff;
}
//---------------------------------------------------------------------------

hl0716 发表于 2008-8-20 10:46:51

使用控件啊

friendljy 发表于 2008-8-20 11:14:53

没有找到啊。。。在哪藏着呢

kill_c 发表于 2008-8-26 08:38:38

呵呵!我正在学!

zz99 发表于 2009-7-22 15:46:51

好象不能通信,楼主有没有自己试一下呢

lingaoxun 发表于 2012-5-16 20:51:58

huayuliang 发表于 2012-5-16 21:07:44

“打开端口失败”,可能是已经被占用。。。。

比如说俺的电脑上COM1--COM8 已经全被占用了,如果再有新的东西,只能用更高的端口号了。

lingaoxun 发表于 2012-5-16 21:22:01

lingaoxun 发表于 2012-5-16 21:22:46

shenarlon 发表于 2012-5-21 21:57:41

呵呵正在学习中                  

kk09 发表于 2013-4-16 23:48:35

我也试了一下,发现串口发不出数据。我使用的是C++ builder XE2。有没有人知道原因啊。
因为数据类型不符的原因,对原例子有点小修改,改为如下:
   char *SendData;
   int ln;
   unsigned long lrc,BS;
   if(hComm == 0)
         return;
      SendData = "123" ;
      BS = 3;
   WriteFile(hComm,SendData,BS,&lrc,NULL);
页: [1]
查看完整版本: 用BCB写的串口通讯。使用API函数,照着例子敲上去的,懒的敲的可以下来直接复制。