1. 程式人生 > >VS 串列埠通訊SerialPort,官方demo

VS 串列埠通訊SerialPort,官方demo

網上有很多解決方案:

主流大概三種:

1、使用mscomm控制元件,是微軟以前提供的控制元件,現在已經放棄了。當然在vs中可以手動整合這個控制元件,也能使用,但是需要註冊。

2、自己程式設計實現串列埠通訊(這個以後有時間寫個部落格)

3、使用.net framework 中的SerialPort類。api地址為:

本文介紹這個裡面demo匯入vs控制檯應用後的錯誤修復問題。

在上面的那個網址中,官方的C++程式碼為:

#using <System.dll>

using namespace System;
using namespace System::IO::Ports;
using namespace System::Threading;

public ref class PortChat
{
private:
    static bool _continue;
    static SerialPort^ _serialPort;

public:
    static void Main()
    {
        String^ name;
        String^ message;
        StringComparer^ stringComparer = StringComparer::OrdinalIgnoreCase;
        Thread^ readThread = gcnew Thread(gcnew ThreadStart(PortChat::Read));

        // Create a new SerialPort object with default settings.
        _serialPort = gcnew SerialPort();

        // Allow the user to set the appropriate properties.
        _serialPort->PortName = SetPortName(_serialPort->PortName);
        _serialPort->BaudRate = SetPortBaudRate(_serialPort->BaudRate);
        _serialPort->Parity = SetPortParity(_serialPort->Parity);
        _serialPort->DataBits = SetPortDataBits(_serialPort->DataBits);
        _serialPort->StopBits = SetPortStopBits(_serialPort->StopBits);
        _serialPort->Handshake = SetPortHandshake(_serialPort->Handshake);

        // Set the read/write timeouts
        _serialPort->ReadTimeout = 500;
        _serialPort->WriteTimeout = 500;

        _serialPort->Open();
        _continue = true;
        readThread->Start();

        Console::Write("Name: ");
        name = Console::ReadLine();

        Console::WriteLine("Type QUIT to exit");

        while (_continue)
        {
            message = Console::ReadLine();

            if (stringComparer->Equals("quit", message))
            {
                _continue = false;
            }
            else
            {
                _serialPort->WriteLine(
                    String::Format("<{0}>: {1}", name, message) );
            }
        }

        readThread->Join();
        _serialPort->Close();
    }

    static void Read()
    {
        while (_continue)
        {
            try
            {
                String^ message = _serialPort->ReadLine();
                Console::WriteLine(message);
            }
            catch (TimeoutException ^) { }
        }
    }

    static String^ SetPortName(String^ defaultPortName)
    {
        String^ portName;

        Console::WriteLine("Available Ports:");
        for each (String^ s in SerialPort::GetPortNames())
        {
            Console::WriteLine("   {0}", s);
        }

        Console::Write("Enter COM port value (Default: {0}): ", defaultPortName);
        portName = Console::ReadLine();

        if (portName == "")
        {
            portName = defaultPortName;
        }
        return portName;
    }

    static Int32 SetPortBaudRate(Int32 defaultPortBaudRate)
    {
        String^ baudRate;

        Console::Write("Baud Rate(default:{0}): ", defaultPortBaudRate);
        baudRate = Console::ReadLine();

        if (baudRate == "")
        {
            baudRate = defaultPortBaudRate.ToString();
        }

        return Int32::Parse(baudRate);
    }

    static Parity SetPortParity(Parity defaultPortParity)
    {
        String^ parity;

        Console::WriteLine("Available Parity options:");
        for each (String^ s in Enum::GetNames(Parity::typeid))
        {
            Console::WriteLine("   {0}", s);
        }

        Console::Write("Enter Parity value (Default: {0}):", defaultPortParity.ToString());
        parity = Console::ReadLine();

        if (parity == "")
        {
            parity = defaultPortParity.ToString();
        }

        return (Parity)Enum::Parse(Parity::typeid, parity);
    }

    static Int32 SetPortDataBits(Int32 defaultPortDataBits)
    {
        String^ dataBits;

        Console::Write("Enter DataBits value (Default: {0}): ", defaultPortDataBits);
        dataBits = Console::ReadLine();

        if (dataBits == "")
        {
            dataBits = defaultPortDataBits.ToString();
        }

        return Int32::Parse(dataBits);
    }

    static StopBits SetPortStopBits(StopBits defaultPortStopBits)
    {
        String^ stopBits;

        Console::WriteLine("Available Stop Bits options:");
        for each (String^ s in Enum::GetNames(StopBits::typeid))
        {
            Console::WriteLine("   {0}", s);
        }

        Console::Write("Enter StopBits value (None is not supported and \n" +
            "raises an ArgumentOutOfRangeException. \n (Default: {0}):", defaultPortStopBits.ToString());
        stopBits = Console::ReadLine();

        if (stopBits == "")
        {
            stopBits = defaultPortStopBits.ToString();
        }

        return (StopBits)Enum::Parse(StopBits::typeid, stopBits);
    }

    static Handshake SetPortHandshake(Handshake defaultPortHandshake)
    {
        String^ handshake;

        Console::WriteLine("Available Handshake options:");
        for each (String^ s in Enum::GetNames(Handshake::typeid))
        {
            Console::WriteLine("   {0}", s);
        }

        Console::Write("Enter Handshake value (Default: {0}):", defaultPortHandshake.ToString());
        handshake = Console::ReadLine();

        if (handshake == "")
        {
            handshake = defaultPortHandshake.ToString();
        }

        return (Handshake)Enum::Parse(Handshake::typeid, handshake);
    }
};

int main()
{
    PortChat::Main();
}


在vs(我使用的是vs2012)建立控制檯應用後,把上述程式碼複製到專案中,會提示有錯誤:


解決方案:

在專案上右擊,點選屬性中公共語言執行時支援下拉選單中選擇公共語言執行時支援(/clr),如下圖


然後就可以運行了。

相關推薦

VS 串列通訊SerialPort官方demo

網上有很多解決方案: 主流大概三種: 1、使用mscomm控制元件,是微軟以前提供的控制元件,現在已經放棄了。當然在vs中可以手動整合這個控制元件,也能使用,但是需要註冊。 2、自己程式設計實現串列埠通訊(這個以後有時間寫個部落格) 3、使用.net framework 中

串列通訊解決serialport.DataReceived接收到的資料不完整

private SerialPort serialport = new SerialPort(); private StringBuilder builder = new StringBuilder(); // private String

一個串列通訊程式適用於3g模組傳送簡單AT指令

原始碼如下: #include <stdio.h> #include <string.h> #include <sys/types.h> #include <errno.h> #include <sys

串列通訊(unityVS通用)

該專案可直接編譯成黑窗體來執行,也可以將程式碼copy到unity中使用。 using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; usi

基於C#實現串列通訊Demo

https://www.cnblogs.com/Zed-H/p/8651882.html 1.基本概念   2.前端winForm佈局如下(僅僅為了實現功能,佈局略醜)   3.程式碼實現如下 1 nam

QT4串列通訊(QT4需要用第三方庫QT5自帶串列通訊

在Qt5之前的版本中並沒有特定的串列埠控制類,現在大部分人使用的是第三方寫的qextserialport類,本文章主要是講解怎樣利用此類實現串列埠通訊。 2、檔案下載地址:      http://sourceforge.net/projects/qextserialport/files/ 3、檔案內容:

我的Android NDK之旅(四)android串列通訊-mac+串列除錯工具

一些關於串列埠的知識 什麼是串列埠 串列埠是計算機上一種非常通用裝置通訊的協議,不要與通用序列匯流排Universal Serial Bus(USB)混淆。大多數計算機包含兩個基於RS232的串列埠。串列埠同時也是儀器儀表裝置通用的通訊協議;很多GP

Android開發板串列SerialPort通訊

前言: 最近在總是看見有人在群裡面問一些串列埠通訊相關的問題,特別是對於我們這些做APP出生的程式設計師來說,初次接觸串列埠通訊的確是會遇到各種Bug,各種摸不著頭腦。串列埠通訊偏向嵌入式一點,是Android裝置通過串列埠與其他裝置進行通訊的一種方式,本文介紹的Andr

在C#中使用SerialPort類實現串列通訊

表1                                                      SerialPort類的常用屬性 名  稱 說  明 BaseStream 獲取 SerialPort 物件的基礎 Stream 物件 Ba

Java實現RS485串列通訊傳送和接收資料進行解析

  最近專案有一個空氣檢測儀,需要得到空氣檢測儀的實時資料,儲存到資料庫當中。根據瞭解得到,硬體是通過rs485進行串列埠通訊的,需要傳送16進制命令給儀器,然後通過輪詢來得到資料。   需要先要下載RXTX的jar包,win64位下載地址:http://pan.baidu.com/s/1o6zLmTc);

串列通訊校驗方式(evenoddspacemark)

奇校驗 (odd parity):如果字元資料位中"1"的數目是偶數,校驗位為"1",如果"1"的數目是奇數,校驗位應為"0"。(校驗位調整個數) 偶校驗 (even parity):如果字元資料位中"1"的數目是偶數,則校驗位應為"0",如果是奇數則為"1"。(校驗位調整個數) mark parit

halcon/mfc利用serialport類進行串列通訊

1.引言 串列埠通訊用mscomm控制元件在x64平臺下報錯,只能在Win32平臺下工作,所以想著換平臺,下載32位的halcon進行安裝。安裝時,不用解除安裝64位,安裝時提示安裝外掛,會自動檢測到runtimeclass x86,安裝好後相當於只是多了一個

C#串列通訊程式SerialPort

上篇文章主要是關於串列埠通訊中微控制器部分的程式編寫。在實際應用中,常常還要有上位機的配合才能完成工作。寫串列埠通訊的上位機程式,常常應用的程式語言有C++,VB,C#等。VB沒有學過,C++編寫視窗應用程式接觸也不多,暑假自己看了一些C#的書,也有了一些瞭解,所以就用C#

樹莓派3B+ 安裝系統;搭建pythonopencv環境;實現串列通訊

一:安裝系統 二:通過VNC訪問樹莓派(無線和有線) 1.樹莓派設定 安裝vnc sudo apt-get update sudo apt-get install tightvncserver 設定vnc密碼(一定要設定,要不然無法

串列通訊C#,C++,簡訊傳送模組實現

AT指令程式設計必讀 基於串列埠通訊的遠端自動抄表系統實現 安瑞爾簡訊網(下載中心)控制元件 通訊技術專欄 Visual C#實現自定義元件的設計 發郵件 用VC 6.0實現序列通訊的三種方法 帶你瞭解無線上網絡卡的安裝和設定 基於CDMA 1X的遠端監控

串列通訊微控制器轉串列

通訊協議又分為硬體層協議和軟體層協議。硬體層協議主要規範了物理上的連線,傳輸電平訊號及傳輸的秩序等硬體性質的內容。常用的硬體協議有串列埠,IIC, SPI, RS485, CAN和 USB。軟體層協議則更側重上層應用的規範,比如modbus協議。 好了,那這裡我

可以修改奇偶校驗位的串列通訊demo

Google提供的SerialPort API 並不支援 奇偶校驗位的更改本Demo可以更改奇偶校驗位,demo為eclipse版本的如果改為studio版本的需要按照下圖將對應的檔案放在對應的位置並在gradle中配置sourceSets { main { jni.

MFC串列通訊例項

參考MSComm控制元件的用法和函式說明。裡面講得也算詳細了。所以這裡直接獻上原始碼示例。 github下載地址 CSDN下載地址 效果如圖: 需要注意的是: 1.如果想同時recv/send,則必須加個執行緒。 2.奇偶校驗中,引數設定為,無(n),偶校驗(o),

C++實現串列通訊上位機軟體

串列埠使用的是RS232匯流排進行通訊,通訊方式是半雙工。有兩種方式可以實現串列埠通訊,一種是通過ActiveX控制元件這種方法程式簡單,但欠靈活。第二個是可以通過呼叫Windows的API函式,本例程通過第二種方式。 一般通過四步來完成通訊(1)開啟串列埠(2)配置串列埠(3)讀寫串列埠(4)

Boost串列通訊第一課 boost::asio::serial_port基本使用

boost庫有一個asio,支援串列埠通訊。步驟:  1、產生一個boost::asio::io_service(前攝模式,類似於完成埠,不過,可以針對不同IO物件)  2、構造一個boost::asio::serial_port,有兩種方法:      (一)boost::asio::serial_po