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
- VS2013串口通信
- vs2013用qt编写串口通信程序
- VS2013 Windows API 串口通信编程--多线程异步方式
- VS2013+CnComm串口通讯
- VS2013下(MFC编程) 与 Omron PLC 串口通信,工控机案列
- 把在vs2013中加载vs2010的串口通信项目中所遇问题
- 串口通信
- 串口通信
- 串口通信
- 串口通信
- 串口通信
- 串口通信
- 串口通信
- 串口通信
- 串口通信
- “串口通信”
- 串口通信
- 串口通信
- TinyOS的Makefile文件语句
- 各种特殊矩阵的压缩存储
- 线性滤波:方框、均值、高斯
- 不定期更新ML学习笔记
- c语言实现快速排序
- VS2013串口通信
- 第一章节
- 迅游网游加速器2015完美和谐版
- hdu 5195 DZY Loves Topological Sorting && BestCoder Round #35
- .NET学习之静态类
- 2014-2015 ACM-ICPC, NEERC, Southern Subregional Contest F. Ilya Muromets
- Ubuntu下配置zsh
- C语言实现双向循环链表
- windows 涉及到的简单socket API函数的用法