VS 串口通信SerialPort,官方demo

转自:https://blog.csdn.net/feixiangsmile/article/details/78210798 
 

网上有很多解决方案:

主流大概三种:

1、使用mscomm控件,是微软以前提供的控件,现在已经放弃了。当然在vs中可以手动集成这个控件,也能使用,但是需要注册。

2、自己编程实现串口通信(这个以后有时间写个博客)

3、使用.net framework 中的SerialPort类。api地址为:

https://msdn.microsoft.com/zh-cn/library/system.io.ports.serialport(v=vs.110).aspx

本文介绍这个里面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),如下图

然后就可以运行了。

 

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值