VS2013串口通信

来源:互联网 发布:怎么优化群排名 编辑:程序博客网 时间:2024/05/01 15:32

水平略低,若有不对请直接指出。

以前接触51的时候就听过串口,但是一直没有机会接触。这一次“炬芯杯”的比赛做一个激光打印机:计算机通过摄像头抓取到人脸,将人脸的数据发送给下位机打印出来,其中计算机和下位机就是通过串口进行通信,那什么是串口通信呢?

串行接口 (Serial Interface) 是指数据一位一位地顺序传送,其特点串行接口串行接口是通信线路简单,只要一对传输线就可以实现双向通信(可以直接利用电话线作为传输线),从而大大降低了成本,特别适用于远距离通信,但传送速度较慢。一条信息的各位数据被逐位按顺序传送的通讯方式称为串行通讯。串行通讯的特点是:数据位的传送,按位顺序进行,最少只需一根传输线即可完成;成本低但传送速度慢。串行通讯可以进一步分为单工、半双工和全双工三种。

串口的协议经常是说RS-232C接口,一般有22根线,其中细节不过多叙述,主要重要的是TXD和RXD两个脚,其中细节也不用过多了解(主要是我不了解…),有很多库帮我们封装好了接口,直接设置好调用就能运行了。


那用VS编程一般用什么库呢?我也不知道,在知网上搜到两个常用库。MSComm控件和SerialPort类,因为MFC快要被淘汰了,果断选择SerialPort类,demo如下,直接看Main函数就行,初始化SerialPort(COM口,频率…等)之后直接读取写入就行了。

其实刚看这个接口,也不是很熟练,对于默认显示串口收到信息的处理等还不清楚,之后了解了再慢慢写吧。

#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("COM port({0}): ", defaultPortName);        portName = Console::ReadLine();        if (portName == "")        {            portName = defaultPortName;        }        return portName;    }    static Int32 SetPortBaudRate(Int32 defaultPortBaudRate)    {        String^ baudRate;        Console::Write("Baud Rate({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("Parity({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("Data Bits({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("Stop Bits({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("Handshake({0}):", defaultPortHandshake.ToString());        handshake = Console::ReadLine();        if (handshake == "")        {            handshake = defaultPortHandshake.ToString();        }        return (Handshake)Enum::Parse(Handshake::typeid, handshake);    }};int main(){    PortChat::Main();}


3 1
原创粉丝点击