1. 程式人生 > >C++ Builder如何用MSComm控制元件進行二進位制方式通訊

C++ Builder如何用MSComm控制元件進行二進位制方式通訊


  需要採用二進位制方式通訊,看參考書上VC裡可以用CByteArray,>>COleVariant等資料型別,方便的採用二進位制方式通訊,C++ Builder似乎沒有這些型別吧?按照VC的方法試過了不行MSDN裡介紹的也是VC裡的一些方法,沒有這方面的資料,哪為達人有,介紹一下。。。。。謝謝了

--------------------------------------------------------------------------------

  二進位制?

  我給你個例子,也許對你有幫助。

  //串列埠列印函式

void __fastcall TfrmMain::MSCPrint( AnsiString DetailText )
{
  String s = DetailText;
  if( MSComm->PortOpen == false )
      MSComm->PortOpen = true;
  MSComm->Output = StringToOleStr( AnsiString(char(28)) + AnsiString(char(38)) );  //輸出中文
  MSComm->Output = StringToOleStr( DetailText );
  MSComm->Output = StringToOleStr( AnsiString(char(10) ));
  MSComm->Output = StringToOleStr( AnsiString(char(10) ));
  MSComm->Output = StringToOleStr( AnsiString(char(10) ));
  MSComm->Output = StringToOleStr( AnsiString(char(10) ));
  MSComm->Output = StringToOleStr( AnsiString(char(10) ));
  MSComm->Output = StringToOleStr( AnsiString(char(10) ));
  MSComm->Output = StringToOleStr( AnsiString(char(10) ));
  MSComm->Output = StringToOleStr( AnsiString(char(10) ));
  MSComm->Output = StringToOleStr( AnsiString(char(27)) + AnsiString(char(109)) );
}
//---------------------------------------------------------------------------
以前做過這方面的程式,給你個程式碼段參考一下:
   OleVariant RxBuff;
   int bytenum;
   char c1;
   AnsiString st1;  //儲存串列埠傳送來的字元
   if(MSComm1->InBufferCount>0 && MSComm1->InputMode==1)
      {
      RxBuff=MSComm1->Input;
      bytenum=RxBuff.ArrayHighBound(1);
      int i=0;
      while(i<=bytenum)
        {
        c1=RxBuff.GetElement(i);
        st1=st1+c1;
        i++;
        }
      }
--------------------------------------------------------------------------------
更正一下:
   OleVariant RxBuff;
   int bytenum;
   char c1;
   AnsiString st1="";  //儲存串列埠傳送來的字元
   if(MSComm1->InBufferCount>0 && MSComm1->InputMode==1)
      {
      RxBuff=MSComm1->Input;
      bytenum=RxBuff.ArrayHighBound(1);
      int i=0;
      while(i<bytenum)
        {
        c1=RxBuff.GetElement(i);
        st1=st1+c1;
        i++;
        }
      }
--------------------------------------------------------------------------------
if (MSComm->PortOpen)
    return;
  MSComm->CommPort= 2;
  MSComm->Settings= "115200, n, 8, 1";
  MSComm->InBufferSize= 4096;
  MSComm->OutBufferSize= 2048;
  MSComm->RThreshold= 1;
  MSComm->SThreshold= 1;
  MSComm->InputMode= comInputModeBinary;
  try {
    MSComm->PortOpen= true;
    MSComm->InputLen= 0;
    MSComm->InBufferCount= 0;
    MSComm->OutBufferCount= 0;
    ShowStatueMessage(1);
    Log(1, "連線成功");
  }
  catch (...){
    ShowStatueMessage(0);
  }
..........
//---------------------------------------------------------------------------
void __fastcall TFrmMain::MSCommComm(TObject *Sender)
{
  char szBuf[RxBUFFERSIZE]={0};
  int i, j;
  OleVariant RxBuff;
  switch (MSComm->CommEvent)
  {
/*    case comEvSend:
      ShowMessage("Send!!!!");
    case comEvCTS:
      ShowMessage("CTS!!!!");
    case comEvDSR:
      ShowMessage("DSR!!!!");
    case comEvCD:
      ShowMessage("CD!!!!");
*/
///*
    case comEvReceive:
      if (MSComm->InBufferCount > 0) {
        RxBuff= MSComm->Input;
        j= RxBuff.ArrayHighBound(1);
        for (i=0; i<=j; i++)
          szBuf[i]= RxBuff.GetElement(i);
        szBuf[i]= NULL;
        #ifdef _DEBUG
        RichEdit1->Lines->Add(AnsiString(szBuf));
        #endif
        if (strstr(szBuf, "+CMTI") != 0) // 收到短訊息了
        {
//        ShowMessage("來短訊息了");
          ProcessSMS(szBuf);
        }
      }
      break;
//*/
    case comEvRing:
      ShowMessage("來電話了!!!!");
      break;
  }
}
你可能主要的麻煩在於  VC和BCB對於 OleVariant支援的不同。
--------------------------------------------------------------------------------
DWORD __fastcall TFrmMain::WriteComm(char *aTxBuff, int BuffSize)
{
  OleVariant TxBuff;
  int i;
  if (MSComm->PortOpen) {
    if (BuffSize > 0) {
      TxBuff= VarArrayCreate(OPENARRAY(int, (0, BuffSize-1)), varByte);
      for (i=0; i<BuffSize; i++)
        TxBuff.PutElement(aTxBuff[i], i);
      MSComm->Output= TxBuff;
    }
  }
  return 0;
}

相關推薦

C++ Builder如何用MSComm控制元件進行二進位制方式通訊

  需要採用二進位制方式通訊,看參考書上VC裡可以用CByteArray,>>COleVariant等資料型別,方便的採用二進位制方式通訊,C++ Builder似乎沒有這些型別吧?按照VC的方法試過了不行MSDN裡介紹的也是VC裡的一些方法,沒有這方面的資料,哪為達人有,介紹一下。。。。。謝謝

C++ builder 自定義控制元件

    在我們開發過程因為軟體的需要 很多的系統控制元件滿足不了我們的需求,這個時候就需要我們通過自定義的控制元件來完成任務 一 自定義控制元件: 1 新建一個包 File->New->P

C++builder安裝IOcomp 控制元件的一些編譯問題解決

IOCOMMP控制元件是一個非常好用的工業類控制元件,裡面有圖示,LED燈燈多種顯示控制元件 首先點選元件,安裝元件, 選中要安裝的IOCOMP55/65.BPK 編譯安裝,出現下面的問題 1      [Linker Fatal Error] Fatal: Unable

C++ Builder 動態建立控制元件

當開發類似解釋程式或實現視覺化操作功能等一類的應用程式時,都需要動態地建立控制元件(物件),而且還要為這些控制元件新增適當的事件處理程式,下面將介紹在C++Builder中如何實現基本的實現框架。動態建立控制元件的一般過程:  TButton *btn = new TButt

MFC串列埠通訊(二)——使用MSComm控制元件實現串列埠通訊

  由於專案需要,最近在寫一個簡單的串列埠通訊,基於MFC框架,寫完之後特此回顧記錄一下學習的過程: 串列埠通訊主體框架 (1) 初始化介面(自動獲取全部可用串列埠) (2) 開啟串列埠 (讀取串列埠號,初始化串列埠引數(波特率、校驗位、資料位等),若

MFC中利用MSComm控制元件實現串列埠通訊的例子

第一步:建工程 第二步:設定基本對話方塊 第三步:設定串列埠ID號 第四步:設定串列埠引數選項 第五步:設定其他控制元件ID號 第六步:新增串列埠控制元件 project->

C# wpf StackPanel控制元件和Border 控制元件 進行基本佈局(2)

1新建一個wpf 程式,去掉grid,控制元件,新增StackPanel控制元件,在新增4個button按鈕,如下圖所示, 分析程式碼,Orientation有2個屬性,1個屬性是Vertical 代表是縱向排列。HorizontalAlignment 代表縱向排列位置,有4個屬性,l

C# Winform專案中多執行緒環境下, 如何跨執行緒對Window窗體控制元件進行安全訪問?

請嘗試執行這段程式碼, 結果你會發現微軟開發工具會提示, Tb_Text.Text = int_Index.ToString(); 涉及"對Windows窗體控制元件進行執行緒安全呼叫", 並給瞭如下的解決方案:https://msdn.microsoft.com/zh-cn/library/ms171728

載入完頁面後,js對介面控制元件進行隱藏

方法1:js寫在在head裡的$(function(){});函式裡,會在頁面完全顯示後,再執行此函式,對控制元件進行隱藏,會先看到控制元件,然後再對控制元件進行隱藏。不推薦此方法。方法2:js寫在</body><script type="text/java

c#.net畫圖很好控制元件 dotnetCHARTING

最近發現一個很好用的控制元件  dotnetCHARTING ,畫圖真的很方便,而且功能很多,可以畫各種各樣的圖 在官方網站上下載的需要註冊,現在網上有破解辦的下載的(需要的朋友可以給我留言,發到郵箱) 下面介紹一個我寫的例子(c#) 1.在的aspx也面上新增chart

控制元件集合VB.NETControls集合對為空的控制元件進行遍歷

題記:寫這篇部落格要主是加深自己對控制元件集合的認識和總結實現演算法時的一些驗經和訓教,如果有錯誤請指出,萬分感謝。 一、需求             面對比較複雜的系統,我們大多是須要對文字框、組合框停止重複判斷,以保證它們不為空。 二、計劃     1、每一個窗體有一個Controls集合,代

對FlowLayoutPanel裡面的控制元件進行排序

FlowLayoutPanel是可以通過設定控制元件的索引值來達到對FlowLayoutPanel裡面的控制元件進行排序的目的。 public virtual void SetChildIndex( Control child, int newIndex ) 在使

MSComm控制元件屬性大揭祕

MSComm控制元件的屬性(必須要熟悉的幾個——CommPort:設定並返回通訊埠號;Setting:以字串的形式設定並返回資料傳輸速率、奇偶校驗、資料位元、停止位元;PortOpen:設定並返回通訊埠的狀態,也可以開啟和關閉埠;Input:從接收緩衝區返回和刪除字元;Output:向傳輸緩衝區定一

iOS 開發 WKWebView載入網頁,對網頁控制元件進行更改,使用OC新增JS

//獲取載入的網頁 - (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void

c#窗體學習——常用控制元件介紹(一)

偷懶,轉自若雲流風,原文:https://blog.csdn.net/ruoyunliufeng/article/details/72874691  一.常用控制元件 Lable標籤→僅顯示文字; TextBox文字控制元件→文字框; Button按鈕控制元件

(轉)C# 自定義使用者控制元件

C# 自定義使用者控制元件   轉:https://blog.csdn.net/xiongxuanwen/article/details/2605109 本例是製作一個簡單的自定義控制元件,然後用一個簡單的測試程式,對於初學者來說,本例子比較簡單,只能起到拋石引玉的效

C#如何在各類控制元件中輸入/輸出資料

textBox 控制元件 輸入:只需要在textBox框中直接輸入資料即可,如圖 輸出:程式碼實現對textBox框的text屬性賦值 textBox.text="這裡輸入要輸出的值"** 得出結果如圖 label 控制元件 輸出:可以直接在label控制元件的text

C#】WPF音樂控制元件

一、使用SoundPlayer SoundPlayer 只能支援WAV格式的檔案 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.

C#根據Form大小控制元件自動更改大小(自適應)

長話短說,直接上程式碼  C#的 1.軟體Form中加入ResizeBegin 或ResizeEnd 事件,或下面兩行加入Form_Load裡面 this.ResizeBegin += new System.EventHandler(this.Form1_ResizeBe

MFC串列埠通訊(一)——MSComm控制元件簡介

Visual C++為我們提供了一種好用的ActiveX控制元件Microsoft Communications Control(即MSComm)來支援應用程式對串列埠的訪問,在應用程式中插入MSComm控制元件後就可以較為方便地實現對通過計算機串列埠收發資料。&nbs