当前位置:文档之家› C#中的串口操作

C#中的串口操作

C#中的串口操作
C#中的串口操作

SerialPort编程(C#)SerialPort 2008-12-25 14:20:08 阅读8760 评论4 字号:大中小订阅微软代码:取出本机的COM端口字符串

public static string[] GetPortNames()

{

RegistryKey localMachine = null;

RegistryKey key2 = null;

string[] textArray = null;

//这里有个断言,判断该注册表项是否存在

new RegistryPermission(RegistryPermissionAccess.Read, @"HKEY_LOCAL_MACHINE\HARDW ARE\DEVICEMAP\SERIALCOMM").Assert();

try

{

localMachine = Registry.LocalMachine;

key2 = localMachine.OpenSubKey(@"HARDWARE\DEVICEMAP\SERIALCOMM", false);

if (key2 != null)

{

string[] valueNames = key2.GetValueNames();

textArray = new string[valueNames.Length];

for (int i = 0; i < valueNames.Length; i++)

{

textArray[i] = (string) key2.GetValue(valueNames[i]);

}

}

}

finally

{

if (localMachine != null)

{

localMachine.Close();

}

if (key2 != null)

{

key2.Close();

}

CodeAccessPermission.RevertAssert();

}

if (textArray == null)

{

textArray = new string[0];

}

return textArray;

}

https://www.doczj.com/doc/7d13423629.html,2005中SerialPort控件操作详解(C#)

using System;

using System.Collections.Generic;

using https://www.doczj.com/doc/7d13423629.html,ponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

using System.IO.Ports;

namespace SerialPorts

{

public partial class frm_Main : Form

{

#region Public Enumerations

public enum DataMode { Text, Hex }

public enum LogMsgType { Incoming, Outgoing, Normal, Warning, Error };

#endregion

private Color[] LogMsgTypeColor = { Color.Orange, Color.Green, Color.Black, Color.Blue, Color.Red };

//禁用和启用程序中各控件的状态

private void EnableControls()

{

// 基于串口的打开与否,设置控件状态

gbPortSettings.Enabled = !ComPort.IsOpen;

btns.Enabled = btnstop.Enabled = txtSendData.Enabled = btnSend.Enabled = ComPort.IsOpen;

if (ComPort.IsOpen) btnOpenPort.Text = "关闭串口";

else btnOpenPort.Text = "打开串口";

}

//初始化组件的数据,为串口提供相关参数

private void InitializeControlValues()

{

cmbParity.Items.Clear();

cmbParity.Items.AddRange(Enum.GetNames(typeof(Parity)));

cmbStopBits.Items.Clear();

cmbStopBits.Items.AddRange(Enum.GetNames(typeof(StopBits)));

cmbPortName.Items.Clear();

foreach (string s in SerialPort.GetPortNames())

cmbPortName.Items.Add(s);

cmbPortName.Text = cmbPortName.Items[0].ToString();

cmbParity.Text = cmbParity.Items[0].ToString();

cmbStopBits.Text = cmbStopBits.Items[0].ToString();

cmbDataBits.Text = cmbDataBits.Items[0].ToString();

cmbParity.Text = cmbParity.Items[0].ToString();

cmbBaudRate.Text = cmbBaudRate.Items[0].ToString();

EnableControls();

}

//十六进制转换字节数组

private byte[] HexStringToByteArray(string s)

{

s = s.Replace(" ", "");

byte[] buffer = new byte[s.Length / 2];

for (int i = 0; i < s.Length; i += 2)

buffer[i / 2] = (byte)Convert.ToByte(s.Substring(i, 2), 16);

return buffer;

}

//字节数组转换十六进制

private string ByteArrayToHexString(byte[] data)

{

StringBuilder sb = new StringBuilder(data.Length * 3);

foreach (byte b in data)

sb.Append(Convert.ToString(b, 16).PadLeft(2, '0').PadRight(3, ' '));

return sb.ToString().ToUpper();

}

//显示数据日志

private void Log(LogMsgType msgtype, string msg)

{

rtfTerminal.Invoke(new EventHandler(delegate

{

rtfTerminal.SelectedText = string.Empty;

rtfTerminal.SelectionFont = new Font(rtfTerminal.SelectionFont, FontStyle.Bold);

rtfTerminal.SelectionColor = LogMsgTypeColor[(int)msgtype];

rtfTerminal.AppendText(msg);

rtfTerminal.ScrollToCaret();

}));

}

//串口发送方式

#region Local Properties

private DataMode CurrentDataMode

{

get

{

if (rbHex.Checked) return DataMode.Hex;

else return DataMode.Text;

}

set

{

if (value == DataMode.Text) rbText.Checked = true;

else rbHex.Checked = true;

}

}

#endregion

//发送数据

private void SendData()

{

if (CurrentDataMode == DataMode.Text)

{

// 发送用户的文本到串口

ComPort.Write(txtSendData.Text);

// 将用户的文本显示到数据窗口

Log(LogMsgType.Outgoing, txtSendData.Text + "\n");

}

else

{

try

{

// 转换用户十六进制数据到字节数组

byte[] data = HexStringToByteArray(txtSendData.Text);

// 发送数据到串口

ComPort.Write(data, 0, data.Length);

// 将用户十六进制数据到数据窗口

Log(LogMsgType.Outgoing, ByteArrayToHexString(data) + "\n");

}

catch (FormatException)

{

// 转换错误

Log(LogMsgType.Error, "十六进制数据有误: " + txtSendData.Text + "\n");

}

}

txtSendData.SelectAll();

}

///

/// -------------------------------------------------------------

///

public frm_Main()

{

InitializeComponent();

}

private void Form1_Load(object sender, EventArgs e)

{

InitializeControlValues();

ComPort.DataReceived += new

SerialDataReceivedEventHandler(port_DataReceived);

}

//打开串口

private void btnOpenPort_Click(object sender, EventArgs e)

{

if (ComPort.IsOpen) ComPort.Close();

else

{

//设置串口参数

ComPort.BaudRate = int.Parse(cmbBaudRate.Text);

ComPort.DataBits = int.Parse(cmbDataBits.Text);

ComPort.StopBits = (StopBits)Enum.Parse(typeof(StopBits), cmbStopBits.Text);

ComPort.Parity = (Parity)Enum.Parse(typeof(Parity), cmbParity.Text);

ComPort.PortName = cmbPortName.Text;

// 打开串口

ComPort.Open();

}

// 改变组件状态

EnableControls();

// 如果串口打开,将焦点放入txtSendData

if (ComPort.IsOpen) txtSendData.Focus();

}

private void rbHex_CheckedChanged(object sender, EventArgs e)

{

if (rbHex.Checked) CurrentDataMode = DataMode.Hex;

}

private void rbText_CheckedChanged(object sender, EventArgs e)

{

if (rbText.Checked) CurrentDataMode = DataMode.Text;

}

//接收数据

private void port_DataReceived(object sender, SerialDataReceivedEventArgs e) {

// 判断用户用的是字节模式还是字符模式

if (CurrentDataMode == DataMode.Text)

{

// 读取缓冲区的数据

string data = ComPort.ReadExisting();

// 显示读取的数据到数据窗口

Log(LogMsgType.Incoming, data + "\n");

}

else

{

// 获取字节长度

int bytes = ComPort.BytesToRead;

// 创建字节数组

byte[] buffer = new byte[bytes];

// 读取缓冲区的数据到数组

ComPort.Read(buffer, 0, bytes);

// 显示读取的数据到数据窗口

Log(LogMsgType.Incoming, ByteArrayToHexString(buffer) + "\n");

}

}

//发送数据按键

private void btnSend_Click(object sender, EventArgs e)

{

SendData();

}

private void lnkAbout_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) {

(new frmAbout()).ShowDialog(this);

}

//时间组件控制发送数据

private void timer1_Tick(object sender, EventArgs e)

{

SendData();

}

//连续发送数据

private void button1_Click(object sender, EventArgs e)

{

delay.Enabled = true;

btns.Enabled = !delay.Enabled;

btnstop.Enabled = delay.Enabled;

}

//停止连续发送数据

private void button2_Click(object sender, EventArgs e)

{

delay.Enabled = false;

btns.Enabled = !delay.Enabled;

btnstop.Enabled = delay.Enabled;

}

}

}

using System;

using System.Collections.Generic;

using https://www.doczj.com/doc/7d13423629.html,ponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

using System.IO.Ports;

using System.IO;

namespace comtest1

{

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

}

private void button1_Click(object sender, EventArgs e)//打开串口

{

try

{

comm.Open();//打开串口方法

textBox1.Text="串口打开OK!";

}//抛出异常

catch(InvalidOperationException)

{

MessageBox.Show("指定的端口已打开");

}

catch(ArgumentOutOfRangeException)

{

MessageBox.Show("此实例的一个或多个属性无效");

}

catch (ArgumentException)

{

MessageBox.Show("端口名称不是以“COM”开始的- 或 -端口的文件类型不受支持"); }

catch(IOException)

{

MessageBox.Show("此端口处于无效状态- 或 -尝试设置基础端口状态失败");

}

catch (UnauthorizedAccessException)

{

MessageBox.Show("对端口的访问被拒绝");

}

}

private void button2_Click(object sender, EventArgs e)

{

try

{

comm.Close();

textBox1.Text = "串口关闭OK!";

}//抛出异常

catch(InvalidOperationException)

{

MessageBox.Show("指定的端口未打开");

}

}

private void Form1_Closed(object sender, EventArgs e)

{

comm.Close();

}

private void comm_DataReceived(object sender, SerialDataReceivedEventArgs e)//接收到数据事件

{

textBox2.Text += Convert.ToString((char)comm.ReadByte());//在文本框上显示接收到的字符

}

}

}

using System;

using System.Collections.Generic;

using https://www.doczj.com/doc/7d13423629.html,ponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

using System.IO.Ports;

namespace SerialPorts

{

public partial class frm_Main : Form

{

#region Public Enumerations

public enum DataMode { Text, Hex }

public enum LogMsgType { Incoming, Outgoing, Normal, Warning, Error };

#endregion

private Color[] LogMsgTypeColor = { Color.Orange, Color.Green, Color.Black, Color. Blue, Color.Red };

//禁用和启用程序中各控件的状态

private void EnableControls()

{

// 基于串口的打开与否,设置控件状态

gbPortSettings.Enabled = !ComPort.IsOpen;

btns.Enabled = btnstop.Enabled = txtSendData.Enabled = btnSend.Enabled = Co mPort.IsOpen;

if (ComPort.IsOpen) btnOpenPort.Text = "关闭串口";

else btnOpenPort.Text = "打开串口";

}

//初始化组件的数据,为串口提供相关参数

private void InitializeControlValues()

{

cmbParity.Items.Clear(); cmbParity.Items.AddRange(Enum.GetNames(typeof(Par ity)));

cmbStopBits.Items.Clear(); cmbStopBits.Items.AddRange(Enum.GetNames(type of(StopBits)));

cmbPortName.Items.Clear();

foreach (string s in SerialPort.GetPortNames())

cmbPortName.Items.Add(s);

cmbPortName.Text = cmbPortName.Items[0].ToString();

cmbParity.Text = cmbParity.Items[0].ToString();

cmbStopBits.T ext = cmbStopBits.Items[0].ToString();

cmbDataBits.Text = cmbDataBits.Items[0].ToString();

cmbParity.Text = cmbParity.Items[0].ToString();

cmbBaudRate.Text = cmbBaudRate.Items[0].ToString();

EnableControls();

}

//十六进制转换字节数组

private byte[] HexStringToByteArray(string s)

{

s = s.Replace(" ", "");

byte[] buffer = new byte[s.Length / 2];

for (int i = 0; i < s.Length; i += 2)

buffer[i / 2] = (byte)Convert.ToByte(s.Substring(i, 2), 16);

return buffer;

}

//字节数组转换十六进制

private string ByteArrayToHexString(byte[] data)

{

StringBuilder sb = new StringBuilder(data.Length * 3);

foreach (byte b in data)

sb.Append(Convert.ToString(b, 16).PadLeft(2, '0').PadRight(3, ' '));

return sb.ToString().ToUpper();

}

//显示数据日志

private void Log(LogMsgType msgtype, string msg)

{

rtfTerminal.Invoke(new EventHandler(delegate

{

rtfTerminal.SelectedText = string.Empty;

rtfTerminal.SelectionFont = new Font(rtfTerminal.SelectionFont, FontStyle.Bold); rtfTerminal.SelectionColor = LogMsgTypeColor[(int)msgtype];

rtfTerminal.AppendT ext(msg);

rtfTerminal.ScrollToCaret();

}));

}

//串口发送方式

#region Local Properties

private DataMode CurrentDataMode

{

get

{

if (rbHex.Checked) return DataMode.Hex;

else return DataMode.Text;

}

set

{

if (value == DataMode.T ext) rbText.Checked = true;

else rbHex.Checked = true;

}

}

#endregion

//发送数据

private void SendData()

{

if (CurrentDataMode == DataMode.T ext)

{

// 发送用户的文本到串口

ComPort.Write(txtSendData.Text);

// 将用户的文本显示到数据窗口

Log(LogMsgType.Outgoing, txtSendData.Text + "\n");

}

else

{

try

{

// 转换用户十六进制数据到字节数组

byte[] data = HexStringT oByteArray(txtSendData.Text);

// 发送数据到串口

ComPort.Write(data, 0, data.Length);

// 将用户十六进制数据到数据窗口

Log(LogMsgType.Outgoing, ByteArrayT oHexString(data) + "\n");

}

catch (FormatException)

{

// 转换错误

Log(LogMsgType.Error, "十六进制数据有误: " + txtSendData.Text + "\n"); }

}

txtSendData.SelectAll();

}

///

/// -------------------------------------------------------------

///

public frm_Main()

{

InitializeComponent();

}

private void Form1_Load(object sender, EventArgs e)

{

InitializeControlValues();

ComPort.DataReceived += new SerialDataReceivedEventHandler(port_DataRec eived);

}

//打开串口

private void btnOpenPort_Click(object sender, EventArgs e)

{

if (ComPort.IsOpen) ComPort.Close();

else

{

//设置串口参数

ComPort.BaudRate = int.Parse(cmbBaudRate.T ext);

ComPort.DataBits = int.Parse(cmbDataBits.Text);

ComPort.StopBits = (StopBits)Enum.Parse(typeof(StopBits), cmbStopBits.Text); ComPort.Parity = (Parity)Enum.Parse(typeof(Parity), cmbParity.Text);

ComPort.PortName = cmbPortName.Text;

// 打开串口

ComPort.Open();

}

// 改变组件状态

EnableControls();

// 如果串口打开,将焦点放入txtSendData

if (ComPort.IsOpen) txtSendData.Focus();

}

private void rbHex_CheckedChanged(object sender, EventArgs e)

{

if (rbHex.Checked) CurrentDataMode = DataMode.Hex;

}

private void rbText_CheckedChanged(object sender, EventArgs e)

{

if (rbText.Checked) CurrentDataMode = DataMode.T ext;

}

//接收数据

private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)

{

// 判断用户用的是字节模式还是字符模式

if (CurrentDataMode == DataMode.T ext)

{

// 读取缓冲区的数据

string data = ComPort.ReadExisting();

// 显示读取的数据到数据窗口

Log(LogMsgType.Incoming, data + "\n");

}

else

{

// 获取字节长度

int bytes = ComPort.BytesToRead;

// 创建字节数组

byte[] buffer = new byte[bytes];

// 读取缓冲区的数据到数组

ComPort.Read(buffer, 0, bytes);

// 显示读取的数据到数据窗口

Log(LogMsgType.Incoming, ByteArrayToHexString(buffer) + "\n");

}

}

//发送数据按键

private void btnSend_Click(object sender, EventArgs e)

{

SendData();

}

private void lnkAbout_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) {

(new frmAbout()).ShowDialog(this);

}

//时间组件控制发送数据

private void timer1_Tick(object sender, EventArgs e)

{

SendData();

}

//连续发送数据

private void button1_Click(object sender, EventArgs e)

{

delay.Enabled = true;

btns.Enabled = !delay.Enabled;

btnstop.Enabled = delay.Enabled;

}

//停止连续发送数据

private void button2_Click(object sender, EventArgs e) {

delay.Enabled = false;

btns.Enabled = !delay.Enabled;

btnstop.Enabled = delay.Enabled;

}

}

}

KEIL中如何用虚拟串口调试串口程序

KEIL中如何用虚拟串口调试串口程序 发表于2008/5/7 15:30:22 以前没接触过串口,一直都以为串口很复杂。最近在做一个新项目,用单片机控制GSM模块。单片机和GSM模块接口就是串口。调试完后觉得串口其实很简单。“不过如此”。这可能是工程师做完一个项目后的共同心态吧。下面详细介绍下如何用虚拟串口调试串口发送接收程序。 需要用到三个软件:KEIL,VSPD XP5(virtual serial ports driver xp5.1虚拟串口软件),串口调试助手。 1、首先在KEIL里编译写好的程序。 2、打开VSPD,界面如下图所示: 左边栏最上面的是电脑自带的物理串口。点右边的add pair,可以添加成对的串口。一对串口已经虚拟互联了,如果添加的是COM3、COM4,用COM3发送数据,COM4就可以接收数据,反过来也可以。 3、接下来的一步很关键。把KEIL和虚拟出来的串口绑定。现在把COM3和KEIL 绑定。在KEIL中进入DEBUG模式。在最下面的COMMAND命令行,输入MODE COM3 4800,0,8,1(设置串口3的波特率、奇偶校验位、数据位、停止位,打开COM3串口,注意设置的波特率和程序里设置的波特率应该一样)ASSIGN COM3 SOUT(把单片机的串口和COM3绑定到一起。因为我用的单片机是AT892051,只有一个串口,所以用SIN,SOUT,如果单片机有几个串口,可以选择S0IN,S0OUT,S1IN,S1OUT。)

4、打开串口调试助手 可以看到虚拟出来的串口COM3、COM4,选择COM4,设置为波特率4800,无校验位、8位数据位,1位停止位(和COM3、程序里的设置一样)。打开COM4。 现在就可以开始调试串口发送接收程序了。可以通过KEIL发送数据,在串口调试助手中就可以显示出来。也可以通过串口调试助手发送数据,在KEIL中接收。这种方法的好处是不用硬件就可以调试。这是网上一篇文章介绍的方法,联系我实际的使用做了整理。有用的着的人就不用继续摸索了

串口调试助手使用方法

串口调试助手使用方法 你可以试试串口监控器,一个功能强大,非常易用的软件。 串口监控器是一个免费的多功能串口通讯监控软件,它能够多种方式显示,接收,分析通讯数据;能够以多种灵活方式发送数据;功能强大,操作简便,在串口通讯监控,设备通讯测试中,能够有效提高工作效率。 主要功能如下: 接收数据: 1. 以十六进制方式显示接收到的数据。 2. 以字符方式显示接收到的数据。 3. 数据帧自动识别,分行显示。 4. 接收数据自动换行设置。 5. 显示或隐藏数据帧的接收时间。 6. 自动清除,自动保存接收到的数据。 7. 接收数据个数计数。 发送数据: 1. 十六进制方式发送数据。 2. 字符串方式发送数据。 3. 发送“发报窗口”当前光标行的数据帧。 4. 循环发送“发报窗口”当前光标行的数据帧。 5. 循环发送“发报窗口”固定行的数据帧。 6. 循环依次发送“发报窗口”的多行数据帧。(设置起始行,行数) 7. 触发发送,接收到“发报窗口”某一行数据,触发发送“发报窗口”另一行数据。 8. 发送数据个数计数。 实用增强功能: 1. 强大易用的进制转换功能。 2. 智能识别当前光标处数据帧的行号,“字符”或“十六进制数”的个数。 3. 智能计算当前选择的“字符”或“十六进制数”的个数。 4. 强大的数据查找功能。 5. 定时保存,定时清除数据。 6. 根据自己的喜好,灵活变换操作界面。

应用场合: 1. 截取和分析设备之间通讯数据流。 2. 串行外围设备硬件开发。 3. 串行设备驱动程序开发。 4. 调试和测试设备和设备之间的串行通讯过程。 5. 记录和分析RS232/422/485通信过程。 6. 模拟某设备通讯过程,对另外设备进行通讯测试。

基于DSP的McBSP串口操作(汇编语言)

McBSP串口操作 一、实验目的 1.学习C54x的McBSP串口的控制和使用; 2.利用VC5402的McBSP串口实现数据的收发; 二、实验原理 所有的 TMS320C54x 都提供了串口,大多数都支持缓冲串口。BSP 串行接口能与串行设备,如编/译码器,串行A/D 和D/A 转换器等直接通信。BSP 支持8,10,12 或16-bit数据单元的发送,同时允许程控串口通讯的时钟频率。 从VC5402 开始,TMS32054x 提供了统一的多通道缓冲串口McBSP。McBSP 串 口是基于TMS320C2X、C20X、C5X、C54X 的标准串口上扩展的,McBSP 提供: ·全速双工通信 ·双缓存发送和三缓存接收数据寄存器,以支持连续传送 ·收和发使用独立的帧和时钟 ·直接与多媒体数字信号编解码器的工业标准接口,以及有模拟接口和与串行 ADC/DAC 的接口 ·外部变速时钟发生器,内部可编程时钟发生器 此外,McBSP 还有下列功能: ·直接与下列格式接口 _ T1/E1 framers _ MVIP switching compatible and ST-BUS compliant devices including: _ MVIP framers _ H.100 framers _ SCSA framers _ IOM-2 compliant devices _ AC97 compliant devices _ IIS compliant devices _ SPI_ devices ·多通道收发,通道数达 128 ·字宽可选: 8, 12, 16, 20, 24, and 32 bits · U-Law and A-Law 压缩与扩展 · 8 位传输时可选先传: LSB or MSB ·帧信号与时钟信号极性可编程 1. McBSP 概述 McBSP 原理图如图9.1所示。McBSP 与外设进行数据传输是通过(DX)脚来发送,(RX)脚来接收,通信的时钟与帧信号是由CLKX, CLKR, FSX, and FSR 脚来控制。DSP 的CPU 或DMA 从数据接收寄存器(DRR[1,2])读取接收数据,发送时向数据发送寄存器(DXR[1,2])写数据。数据写入(DXR[1,2])后通过传输移位寄存器(XSR[1,2]) 移位输出到DX 上,同样,从DR 上接收的数据移位存储到接收移位寄存器(RSR[1,2]) 并拷贝到接收缓存寄存器(RBR[1,2]) ,然后,再由(RBR[1,2])拷贝到DRR[1,2],DRR[1,2]就可以由CPU 或DMA 来读出。多级寄存器允许在通信时内部和外部数据同时传输。C54x 对McBSP 的控制由16 位的控制寄存器实现。

串口服务器的原理及使用方法

串口服务器的原理及使用方法 串口服务器是将来自TCP/IP协议的数据包,解析为串口数据流;反之,也可以将串口数据流打成TCP/IP协议的数据包,从而实现数据的网络传输。它能多个串口设备连接并能将串口数据流进行选择和处理,把现有的TTL串口或者RS232/RS485/RS422接口的数据转化为IP端口的数据,这样就能够将传统的串行数据送上流行的IP通道,而无须过早的淘汰原有的不带以太网模块的设备,从而提高现有设备的利用率,节约了投资,简化了布线。在数据处理方面,串口服务器完成的是一个面向连接的TTL串口或者RS232/RS485/RS422链路和面向无连接以太网之间的通讯数据的存储控制,系统对各种数据进行处理,处理来自串口设备的串口数据流,并进行格式转换,使之成为可以在以太网中传播的数据帧;对来自以太网的数据帧进行判断,并转换成串行数据送达响应的串口设备。在实际应用方面,串口服务器完成是将TCP/IP协议的以太网接口映射为Windows操作系统下的一个标准串口,应用程序可以像对普通串口一样对其进行收发和控制,比如一般计算机有两个串口COM1和COM2,通过串口服务器可将其上面的串口映射为COM3、COM4、COM5等。 串口联网服务器产品提供了直接通过网络来访问工业设备的解决方案。传统串口设备因此可以被转换成可以从局域网甚至互联网来监测和控制的以太网设备。IOTworkshop的串口服务器提供不同的配置和规格特性以符合特殊应用的需求,包括有Modbus协议转换、TCP、UDP操作模式等。串口联网服务器是重新改造既有串口设备最简单的办法,包括PLC、数控机床、仪器仪表、传感器、无线电收发机和其他串口设备。在自动化工业领域、有成千上万的感应器、检测器、PLC、读卡器或其他设备,互相连接形成一个控制网络,作为信息系统中管理数据的工具。而最常用来连接这些设备的通讯界面就是RS232和RS422/RS485总线。以太网/互联网等网络架构已逐渐在自动化产业内被广泛的采用,取代传统的串口通讯而成为自动化系统通讯的主流。在这种趋势下,以TCP/IP和以太网为代表的成熟度较高的开放式网络技术,正逐渐地被应用在各个自动化系统,连接并控制所有的设备。对所有设备制造商和设备使用者而言,寻求一个经济、快速的解决方案,让现有的设备可立即联网使用,成为掌握竞争商机的重要课题。IOTworkshop出品的Eport-E10超级网口、HF5111设备联网服务器正是这种“立即联网”的解决方案。它可以让传统的TTL串口或者RS232/485/422设备,立即转换成具备网络界面的网络设备。 1.直连方式:所谓直连就是将计算机上的网线口与串口服务器上的以太网口直接相连, 如图1所示。该组网方式布线简单,可以实现较长距离传输,较长距离传输的实现 是因为从计算机到串口服务器的距离增大。网线的制作与一般的上网用的网线接线 相同。通过虚拟串口管理软件将串口服务器上的串口映射为COM3、COM4等,便 可像普通串口一样对其进行操作。对于Eport-E10来说,如果将其TTL串口增加 MAX485芯片就成为RS422或RS485,同样可以将其映射为COM3、COM4等,所 以对于上位机来说不管串口服务器以什么样的串口方式输出,其操作方式与对计算 机自身的COM1、COM2口的操作方式一样,大大简化了上位机的编程工作量。然 而,串口服务器真正的优势以及价值的体现并不是表现在直连方式的应用上,将设 备连接到以太网上是它重要的目的。

STM32利用虚拟串口调试

STM32串口利用虚拟串口调试 解决*** error 30: undefined name of virtual register 问题 以下摘录于网络。 1. 利用VSPD将PC上的两个虚拟串口连接起来。如图我将COM2 和COM3连接起来。点击Addr pair。 2. 可以看到Virtual ports上将两个虚拟串口连接到了一起了。 3.虚拟串口准备就绪了。先将直接输入命令的方式来调试。我们打开KEIL MDK的,设置成仿真的模式。点DEBUG.在COMMAND串口输入: MODE COM2 38400, 0, 8, 1

说明: MODE命令的作用是设置被绑定计算机串口的参数。基本使用方式为:

MODE COMx baudrate, parity, databits, stopbits 其中: COMx(x = 1,2,…)代表计算机的串口号; baudrate代表串口的波特率;parity代表校验方式; databits代表数据位长度; stopbits代表停止位长度。 例如:MODE COM1 9600, n, 8, 1 设置串口1。波特率为9 600,无校验位,8位数据,1位停止位。 MODE COM2 19200, 1, 8, 1 设置串口2。波特率为19 200,奇校验,8位数据,1位停止位。 4、点回车后,再输入ASSIGN COM2 S1OUT 说明: COMx代表计算机的串口,可以是COM1、COM2、COM3或其他; inreg和outreg代表单片机的串口。对于只有一个串口的普通单片机,即SIN和SOUT;对于有两个或者多个串口的单片机,即SnIN和SnOUT(n=0,1,…即单片机的串口号)。 例如:ASSIGN COM1 < SIN > SOUT 将计算机的串口1绑定到单片机的串口(针对只有一个串口的单片机)。 ASSIGN COM2 < SIN > SOUT 将计算机的串口2绑定到单片机的串口0(针对有多个串口的单片机,注意串口号的位置)。 需要注意的是,参数的括号是不能省略的,而outreg则是没有括号的。

串口调试助手使用说明概要

串口调试助手使用说明 为简单明了,有些不言自明的功能不作介绍。 1 串口调试助手 1.1 设置串口参数: 串口号:1-16 波特率:600-256000,>115200 时需要硬件支持。 2 接收区/键盘发送区 2.1 接收数据 a 设置串口参数 b 如果要按十六进制形式显示接收数据,将十六进制显示选项选中。 c 点击打开/关闭串口区中的打开串口按钮。 2.2 显示接收数据的长度 因某些限制,显示接收数据的文本不能太长,所以当显示文本长度快达到 62K 时会自动将显示文本删减到 32K,此时文本可保留 32K 的字符或约 10K 的十六进制数据显示。 2.3 在键盘上发送英文字符 a在接收区/键盘发送区的输入框中用鼠标点一下。 b在键盘按下按键立刻发送。 在这里不能发送回车换行,也不能发送汉字,若要发送请在单字符串发送区发送。 3 发送数据 可以发送单字符串,多字符串(字符串序列或直接在键盘上发送英文字符。有两种发送数据格式,一种是普通的字符串,另外一种是十六进制数据即 HEX 格式数据。发送 HEX 格式数据时要在字符串输入区中输入 HEX 格式字符串,并且要将相应区内的十六进制发送选项选中。 例:HEX 格式数据字符串12 34 AB CD FF

3.1 单字符串发送区 3.1.1自动发送,自动发送周期: 此项功能可以每隔一段时间反复地自动发送输入框中的数据,点击自动发送按钮后即启动自动发送功能。 自动发送周期最大为 65535mS。 3.2 多字符串发送区 在多字符串发送区可以发送一个字符串,或者自动地、依次发送所有的字符串。 请把鼠标移到“接收区/键盘发送区”和“多字符串发送区”之间,当鼠标形状发生变化时按下鼠标器的左键不松开,然后移动鼠标,将“多字符串发送区”的宽度调宽一些,让“间隔时间”显露出来。 3.2.1发送一个字符串 a 输入字符串。 b 如果要发送 16 进制数据, 要先在字符串后的 HEX 选项框中打上对勾。 c 点击发送按钮。发送后,按钮上的数字作为当前字符串序号保存起来,此序号在自动循环发送中要用到它。 3.2.2 发送多个字符串(字符串序列 a 输入多个字符串。 b 如果要发送 16 进制数据, 将相应的 HEX 选项打上对勾。 c 输入间隔时间,最大为 65535mS。 d 点击自动循环发送按钮。 延时时间到达后发送当前字符串( 见3.2.1的步骤 c 的下一个字符串,间隔一段时间后再发送下一个。发送完毕自动从头开始继续发送。 4 打开/关闭串口区 下载后打开串口选项:选中这选项后,每次下载后会自动打开调试助手指定的串口,接收应用程序发送的数据。

串口通信的接线方法

目前较为常用的串口有9针串口(DB9)和25针串口(DB25),通信距离较近时(<12m),可以用电缆线直接连接标准RS232端口(RS422、RS485较远),若距离较远,需附加调制解调器(MODEM)。最为简单且常用的是三线制接法,即地、接收数据和发送数据三脚相连,本文只涉及到最为基本的接法,且直接用RS232相连。 1、DB9和DB25的常用信号脚说明 2、RS232C串口通信接线方法(三线制) 首先,串口传输数据只要有接收数据针脚和发送针脚就能实现:同一个串口的接收脚和发送脚直接用线相连,两个串口相连或一个串口和多个串口相连同一个串口的接收脚和发送脚直接用线相连对9针串口和25针串口,均是2与3直接相连; 两个不同串口(不论是同一台计算机的两个串口或分别是不同计算机的串口) 图2 上面表格是对微机标准串行口而言的,还有许多非标准设备,如接收GPS数据或电子罗盘数据,只要记住一个原则:接收数据针脚(或线)与发送数据针脚(或线)相连,彼些交叉,信号地对应相接,就能百战百胜。 3、串口调试中要注意的几点: 不同编码机制不能混接,如RS232C不能直接与RS422接口相连,市面上专门的各种转换器卖,必须通过转换器才能连接; 线路焊接要牢固,不然程序没问题,却因为接线问题误事;

串口调试时,准备一个好用的调试工具,如串口调试助手、串口精灵等,有事半功倍之效果; 强烈建议不要带电插拨串口,插拨时至少有一端是断电的,否则串口易损坏。 RS232C标准串口接线方法 (第二版) 检验仪器与微机的通讯主要是以RS232C标准接口为主,而串口的接线方法也有一定的标准,在此谈谈几种常用的串口接法,仅作参考: 一、标准接法 1、9对9(包括9针对9孔,9孔对9孔,9针对9针): 说明:以下的孔、针指串口线两端的串口,不过2、3有可能不交换 2-------------3 3-------------2 4-------------6 5-------------5 6-------------4 7-------------8 8-------------7 2、9对25(包括9孔对25孔,9孔对25针) 2-------------3 (备注:2、3有可能不交换) 3-------------2 4-------------6 5-------------7 6-------------20 7-------------5 8-------------4

串口API函数介绍

2-CreateFile() 用途:打开串口 原型:HANDLE CreateFile(LPCTSTR lpFileName, DWORD dwDesired Access, DWORD dwShareMode, LPSECUR IT Y_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDistribution, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile); 参数说明: -lpFileName:要打开的文件名称。对串口通信来说就是COM1或COM2。 -dwDesired Access:读写模式设置。此处应该用GENERIC_READ及GENERIC_WR IT E。 -dwShareMode:串口共享模式。此处不允许其他应用程序共享,应为0。 -lpSecurityAttributes:串口的安全属性,应为0,表示该串口不可被子程序继承。 -dwCreationDistribution:创建文件的性质,此处为OPEN_EXISTING. -dwFlagsAndAttributes:属性及相关标志,这里使用异步方式应该用FILE_FLAG_OVERLAPPED。 -hTemplateFile:此处为0。 操作说明:若文件打开成功,串口即可使用了,该函数返回串口的句柄,以后对串口操作时即可使用该句柄。 举例:HANDLE hComm; hComm=CreateFile("COM1", //串口号 GENERIC_READ|GENERIC_WR IT E, //允许读写 0, //通讯设备必须以独占方式打开 NULL, //无安全属性 OPEN_EXISTING, //通讯设备已存在 FILE_FLAG_OVERLAPPED, //异步I/O 0); //通讯设备不能用模板打开 hComm即为函数返回的串口1的句柄。 3-CloseHandle() 用途:关闭串口 原型:BOOL CloseHandle(HANDLE hObjedt) 参数说明: -hObjedt:串口句柄 操作说明:成功关闭串口时返回true,否则返回false 举例:CloseHandle(hComm); 4-GetCommState() 用途:取得串口当前状态

虚拟串口使用方法

虚拟串口使用方法 虚拟串口访问方法要配合上位机驱动软件一起使用。安装了虚拟串口驱动程序后,利用虚拟串口管理软件创建一个虚拟串口,此虚拟串口的使用方法相当于电脑自带的实串口,它会自动检测打开该串口的软件所用的波特率和数据位停止位等信息,并同步到串口服务器,不需要手动设置。虚拟串口软件具有网络连接心中检测功能,可以检测到网络的异常断开,并自动重新连接。 按以下步骤操作,先把串口服务器的工作模式设置为TCP 服务器模式,再安装驱动软件创建串口。 0,串口服务器的设置 先通过网页浏览器登录串口服务器管理页面,设置串口服务器的工作参数。在浏览器的URL地址栏中输入串口服务器的IP地址(如串口服务器的默认IP为:192.168.1.111,用户名为:admin,密码为:admin),打开管理登录界面: 输入用户名和密码后看到串口服务器的当前工作参数:

在对应的串口的[串口设置]功能选项中的[连接模式]选项中选择“TCP 服务器”(串口服务器一厂时一般默认为该模式),其它参数不用设置(驱动程序会根据实际检测到的情况自动 修改)。如下所示:

其它选项不用填,选择“保存为默认设置”后提交马上生效,关机后仍然生效,当[连接模式]改变时请重启串口服务器。 1 虚拟串口软件安装 要通过虚拟串口方式来访问设备必须安装此软件,通过socket方式即可不安装. 安装软件系统要求: 操作系统:windows2000/XP/2003; CPU:1.4G或以上; 内存:128M以上。 在安装文件中,双击Setup.exe 文件,进入安装界面.

点击下一步,进入下一个安装界面, 如果同意软件安装协议选择”我接受”,否则选择”取消”退出安装.选择”我接受”进入下一个安装界面: 选择程序安装目标文件夹,由于所需空间很小,只需要8M左右,一般按照默认则可,若要改变目标文件夹,在”浏览”中选择你的目标文件夹,单击”安装”按钮进入一下安装界面. 在安装过程中会弹出以下窗口,提示正在安装驱动,请勿关闭此窗口,驱动安装完成后些窗口会自动关闭。

虚拟串口Virtual Serial Port说明书

VSPM虚拟串口软件使用帮助虚拟串口软件使用帮助 (Ver2.5) (Ver2.5)

一、一、 软件介绍软件介绍 1、 功能说明功能说明 VSPM 虚拟串口软件可以将TCP/IP 连接、连接、UDP UDP 广播,映射成本机的虚拟COM 口,应用程序通过访问虚拟串口,就可以完成远程控制、数据传输等功能。等功能。 VSPM 虚拟串口软件特点:虚拟串口软件特点: 多虚拟串口映射多虚拟串口映射 收/发多线程架构发多线程架构 支持虚拟串口参数同步指令支持虚拟串口参数同步指令 自动错误纠正、自动连接、自动重新试自动错误纠正、自动连接、自动重新试 实时虚拟串口数据传输监控实时虚拟串口数据传输监控 集成Telnet 管理器管理器 集成设备探测器集成设备探测器 Server Server、、Client Client、、U DP 广播模式,广播模式,33种工作模式种工作模式 支持扩展DLL 插件,具备强大的扩展功能插件,具备强大的扩展功能 免费软件免费软件

2、 VSPM 软件适用范围软件适用范围 适用的嵌入式设备适用的嵌入式设备 可以将任何使用TCP/IP 或UDP 广播方式传输数据的嵌入式设备虚拟成本机COM 口。口。 这些设备包括串口服务器、无线DTU 或其他各类嵌入式以太网&TCP/IP 设备。设备。 虚拟串口互联虚拟串口互联 1台电脑用Server 模式和Client 模式运行2个VSPM 虚拟串口软件,可以实现虚拟串口互联。可以实现虚拟串口互联。 软件调试及串口通讯模拟软件调试及串口通讯模拟 利用各类扩展DLL 插件,可以使VSPM 模拟成一个串口设备,方便软件调试。件调试。 3、 VSP VSPM M 虚拟串口性能参数虚拟串口性能参数 项目项目 配置配置 端口速度端口速度 110110--115200bps 115200bps 数据位数据位 5、6、7、8 停止位停止位 1、2 校验位校验位 无、奇、偶、标记。无、奇、偶、标记。 流控流控 可设置流控,但VSPM 软件在转发时忽略此设置。软件在转发时忽略此设置。 发送缓冲发送缓冲 8K 字节,如果超过此长度,将丢弃超出部分的数据。字节,如果超过此长度,将丢弃超出部分的数据。

串口调试助手使用规范V15.01(试用)

串口调试助手使用规范(试用) ——截取指令方法
版本:V15.01 日期:2015.0128 类别:APP 使用规范
1
串口调试助手使用规范(试用) 截取指令方法
广州市英沙电子系统有限公司 2015-01-28 发布

串口调试助手使用规范(试用) ——截取指令方法
版本:V15.01 日期:2015.0128 类别:APP 使用规范
2
目 录
1 引言 ................................................................................................................................................................................... 3 2 使用前准备........................................................................................................................................................................ 3 3 串口调试助手及其安装 ................................................................................................................................................... 3 4 串口线与设备的物理连接 ............................................................................................................................................... 4 5 串口调试助手截取指令步骤 ............................................................................................................................................ 4 6 分析截取的指令............................................................................................................................................................... 6?

MFC串口通信编程详解解析

MFC串口通信编程介绍 主要介绍了用CreateFile(函数和WriteFile(函数读写串口的实例,以及设置串口属性的实例. 在工业控制中,工控机(一般都基于Windows平台经常需要与智能仪表通过串口 进行通信.串口通信方便易行,应用广泛. 一般情况下,工控机和各智能仪表通过RS485总线进行通信.RS485的通信方式是半双工的,只能由作为主节点的工控PC机依次轮询网络上的各智能控制单元子节点.每次通信都是由PC机通过串口向智能控制单元发布命令,智能控制单元在接收到正确的命令后作出应答. 在Win32下,可以使用两种编程方式实现串口通信,其一是使用ActiveX控件,这种方法程序简单,但欠灵活.其二是调用Windows的API函数,这种方法可以清楚地掌握串口通信的机制,并且自由灵活.下面只介绍API串口通信部分. 串口的操作可以有两种操作方式:同步操作方式和重叠操作方式(又称为异步操作方式.同步操作时,API函数会阻塞直到操作完成以后才能返回(在多线程方式中, 虽然不会阻塞主线程,但是仍然会阻塞监听线程;而重叠操作方式,API函数会立即返回,操作在后台进行,避免线程的阻塞. 无论哪种操作方式,一般都通过四个步骤来完成: (1打开串口 (2配置串口 (3读写串口 (4关闭串口

一打开串口 Win32系统把文件的概念进行了扩展.无论是文件、通信设备、命名管道、邮件槽、磁盘、还是控制台,都是用API函数CreateFile来打开或创建的.该函数的原型为: HANDLE CreateFile( LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDistribution, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile; ?lpFileName:将要打开的串口逻辑名,如“COM1”; ?dwDesiredAccess:指定串口访问的类型,可以是读取、写入或二者并列; ?dwShareMode:指定共享属性,由于串口不能共享,该参数必须置为0; ?lpSecurityAttributes:引用安全性属性结构,缺省值为NULL; ?dwCreationDistribution:创建标志,对串口操作该参数必须置为 OPEN_EXISTING; ?dwFlagsAndAttributes:属性描述,用于指定该串口是否进行异步操作,该值为FILE_FLAG_OVERLAPPED,表示使用异步的I/O;该值为0,表示同步I/O操 作;

读取串口数据

读取串口数据 方法一:使用VC++提供的串行通信控件MSComm 首先,在对话框中创建通信控件,若Control工具栏中缺少该控件,可通过菜单Project --> Add to Project --> Components and Control插入即可,再将该控件从工具箱中拉到对话框中。此时,你只需要关心控件提供的对Windows 通讯驱动程序的 API 函数的接口。换句话说,只需要设置和监视MSComm控件的属性和事件。 在ClassWizard中为新创建的通信控件定义成员对象(CMSComm m_Serial),通过该对象便可以对串口属性进行设置,MSComm 控件共有27个属性,这里只介绍其中几个常用属性: CommPort 设置并返回通讯端口号,缺省为COM1。 Settings 以字符串的形式设置并返回波特率、奇偶校验、数据位、停止位。 PortOpen 设置并返回通讯端口的状态,也可以打开和关闭端口。 Input 从接收缓冲区返回和删除字符。 Output 向发送缓冲区写一个字符串。 InputLen 设置每次Input读入的字符个数,缺省值为0,表明读取接收缓冲区中的全部内容。 InBufferCount 返回接收缓冲区中已接收到的字符数,将其置0可以清除接收缓冲区。 InputMode 定义Input属性获取数据的方式(为0:文本方式;为1:二进制方式)。 RThreshold 和 SThreshold 属性,表示在 OnComm 事件发生之前,接收缓冲区或发送缓冲区中可以接收的字符数。 以下是通过设置控件属性对串口进行初始化的实例: BOOL CSampleDlg:: PortOpen() { BOOL m_Opened; ...... m_Serial.SetCommPort(2); // 指定串口号 m_Serial.SetSettings("4800,N,8,1"); // 通信参数设置 m_Serial.SetInBufferSize(1024); // 指定接收缓冲区大小 m_Serial.SetInBufferCount(0); // 清空接收缓冲区 m_Serial.InputMode(1); // 设置数据获取方式

stm32跑RT-thread之串口操作简介

UART 设备 UART 简介 UART(Universal Asynchronous Receiver/Transmitter)通用异步收发传输器,UART 作为异步串口通信协议的一种,工作原理是将传输数据的每个字符一位接一位地传输。是在应用程序开发过程中使用频率最高的数据总线。 UART 串口的特点是将数据一位一位地顺序传送,只要 2 根传输线就可以实现双向通信,一根线发送数据的同时用另一根线接收数据。UART 串口通信有几个重要的参数,分别是波特率、起始位、数据位、停止位和奇偶检验位,对于两个使用 UART 串口通信的端口,这些参数必须匹配,否则通信将无法正常完成。UART 串口传输的数据格式如下图所示: ?起始位:表示数据传输的开始,电平逻辑为“0” 。 ?数据位:可能值有 5、6、7、8、9,表示传输这几个 bit 位数据。一般取值为 8,因为一个 ASCII 字符值为 8 位。 ?奇偶校验位:用于接收方对接收到的数据进行校验,校验“1” 的位数为偶数(偶校验)或奇数(奇校验),以此来校验数据传送的正确性,使用时不需要此位也可以。 ?停止位:表示一帧数据的结束。电平逻辑为“1”。 ?波特率:串口通信时的速率,它用单位时间内传输的二进制代码的有效位(bit)数来表示,其单位为每秒比特数 bit/s(bps)。常见的波特率值有4800、9600、14400、38400、115200等,数值越大数据传输的越快,波特率为115200 表示每秒钟传输 115200 位数据。 访问串口设备 应用程序通过 RT-Thread提供的 I/O 设备管理接口来访问串口硬件,相关接口如下所示:

串口基本常识

串口引脚图.jpg 串口通信的基本概念 1,什么是串口? 2,什么是RS-232? 3,什么是RS-422? 4,什么是RS-485? 5,什么是握手? 1,什么是串口 串口是计算机上一种非常通用设备通信的协议(不要与通用串行总线Universal Serial Bus或者USB混淆)。大多数计算机包含两个基于RS232的串口。串口同时也是仪器仪表设备通用的通信协议;很多GPIB兼容的设备也带有RS-232口。同时,串口通信协议也可以用于获取远程采集设备的数据。 串口通信的概念非常简单,串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。它很简单并且能够实现远距离通信。比如IEEE488定义并行通行状态时,规定设备线总常不得超过20米,并且任意两个设备间的长度不得超过2米;而对于串口而言,长度可达1200米。 典型地,串口用于ASCII码字符的传输。通信使用3根线完成:(1)地线,(2)发送,(3)接收。由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据。其他线用于握手,但是不是必须的。串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。对于两个进行通行的端口,这些参数必须匹配: a,波特率:这是一个衡量通信速度的参数。它表示每秒钟传送的bit的个数。例如300波特表示每秒钟发送300个bit。当我们提到时钟周期时,我们就是指波特率例如如果协议需要4800波特率,那么时钟是4800Hz。这意味着串口通信在数据线上的采样率为4800Hz。通常电话线的波特率为14400,28800和36600。波特率可以远远大于这些值,但是波特率和距离成反比。高波特率常常用于放置

AVR USART串口使用范例

/* A VR USART串口使用范例 编译器:WinA VR-20050214 本程序简单的示范了如何使用A TMEGA16的USART USART的设置 波特率的计算 发送采用查询方式 接收采用中断方式 */ #include #include #include #include /* 注:本范例为7.3728MHz外部石英晶体振荡器即F_CPU=7372800 因为7.3728MHz能生成多种标准的通讯波特率 如果使用其他系统时钟频率,注意波特率误差不要超过+/-1%. 做USART通讯时,除非你掌握了校准技术,否则请不要使用内部/外部RC振荡器 */ //管脚定义 #define PIN_RXD 0 //PD0 RXD #define PIN_TXD 1 //PD1 TXD #define LED0 0 //PA0 #define LED1 1 //PA1 #define LED2 3 //PA3 //常量定义 #define BAUDRA TE 9600 //波特率 //#define F_CPU 7372800 //这个已经在makefile里面定义了 //宏定义 #define LED0_ON() PORTA&=~(1<

zstack 串口使用指南

zstack 串口使用指南.txt如果不懂就说出来,如果懂了,就笑笑别说出来。贪婪是最真实的贫穷,满足是最真实的财富。幽默就是一个人想哭的时候还有笑的兴致。转载 zstack 串口使用指南2009-05-04 02:00Z-STACK问题之串口结构uartCfg_t乱说 typedef struct { uint8 *rxBuf;//接收缓存 uint8 rxHead;//头 uint8 rxTail;//尾 uint8 rxMax;//接收最大长度 uint8 rxCnt;//计数 uint8 rxTick;//时间 uint8 rxHigh;//高位 uint8 *txBuf; #if HAL_UART_BIG_TX_BUF uint16 txHead; uint16 txTail; uint16 txMax; uint16 txCnt; #else uint8 txHead; uint8 txTail; uint8 txMax; uint8 txCnt; #endif uint8 txTick; uint8 flag;//标志位 halUARTCBack_t rxCB; } uartCfg_t; 有个朋友问我上面的问题,说句老实话,我可是第一次见这个东东,拿到手之后比我那朋友还迷糊,那位朋友至少还知道大概是什么功能,仅仅是不清楚每个参数的具体含义和功能。为了解决这个问题,我可是遍寻名家,最终结果是人家也不是很清楚,因为平常大家只管用,哪管那么多这些具体细节?没办法,我只有自己解决了,希望我的努力能给大家一点点启示!首先说说这个结构的应用范畴,它是直接面向串口的应用层,也就是与客户接触的还是比较紧密的一个结构,一般是在串口接收数据和发送数据的时候使用。而串口有两种方式,一种是普通的串口,一种是DMA方式。这里我只针对普通串口来分析这个结构。 首先来看看这个结构在什么地方用到了? static void pollDMA( uartCfg_t *cfg ) static void pollISR( uartCfg_t *cfg ) 这两个函数直接就用到了这个结构作为参数,应该说是联系最紧密的了,是我们重点剖析的对象了,但是这里不看DMA,因为这个俺很外行----------哈哈!!!! uint16 HalUARTRead( uint8 port, uint8 *buf, uint16 len ) uint8 HalUARTOpen( uint8 port, halUARTCfg_t *config )

VC串口编程API详解

V C串口编程A P I详解集团企业公司编码:(LL3698-KKI1269-TM2483-LUI12689-ITT289-

V C++串口编程主要A P I详解该文档是本人在刚刚接触到VC++下的串口编程时,总结归纳的一些主要的API函数,可以帮助初学者更好的理解串口编程的方法。 1.打开串口 HANDLECreateFile(LPCTSTRlpFileName, DWORDdwDesiredAccess, DWORDdwShareMode, LPSECURITY_ATTRIBUTESlpSecurityAttributes, DWORDdwCreationDistribution, DWORDdwFlagsAndAttributes, HANDLEhTemplateFile); 参数: lpFileName:将要打开的串口逻辑名,如“COM1”;dwDesiredAccess:指定串口访问的类型,可以是读取、写入或二者并列; dwShareMode:指定共享属性,由于串口不能共享,该参数必须置为0;lpSecurityAttributes:引用安全性属性结构,缺省值为NULL;

dwCreationDistribution:创建标志,对串口操作该参数必须置为OPEN_EXISTING; dwFlagsAndAttributes:属性描述,用于指定该串口是否进行异步操作,该值为FILE_FLAG_OVERLAPPED,表示使用异步的I/O;该值为0,表示同步I/O操作,本工程采用异步方式; hTemplateFile:对串口而言该参数必须置为NULL; 2.获取串口设备控制块DCB BOOLGetCommState( HANDLEhFile, //标识通讯端口的句柄,由CreateFile()函数返回的句柄 LPDCBlpDCB //指向一个设备控制块(DCB结构)的指针 ); 3.设置串口设备控制块DCB BOOLSetCommState( HANDLEhFile,//标识通讯端口的句柄,由CreateFile()函数返回的句柄LPDCBlpDCB//指向一个设备控制块(DCB结构)的指针 ); 4.设置串口输入输出缓冲区大小 BOOLSetupComm( HANDLEhFile, //通信设备的句柄DWORDdwInQueue, //输入缓冲区的大小(字节数)DWORDdwOutQueue //输出缓冲区的大小(字节数)

虚拟串口以及在Proteus中的使用

一,虚拟串口 虚拟串口是计算机通过软件模拟的串口,当其它设计软件使用到串口的时候,可以通过调用虚拟串口仿真模拟,以查看所设计的正确性。首先要安装虚拟串口设置的软件,网上有很多设置虚拟串口的软件,我用的是VSPD,可试用1个月,试用期过后,该软件将不能使用,但不用担心,所设置的虚拟串口不会消失,可以继续使用。 设置界面: 我设置的是COM3和COM4,软件只能成对设置,主要是因为通信时,一方可以监视另一方,如果仅设置1个虚拟串口的话,如你用COM3发送接收数据,但发送了什么接收到什么,你无法验证其正确与来源。这是人家编写软件的

高明之处。软件设置时将所设置的两个虚拟串口对接,这样就可实现发送与接收的监视。从设备管理器中可以看到 两个虚拟串口对接方式:

这样可以用串口调试助手调试串口通信了,从下图可以看到COM3发送的数据到达了COM4的接收区域,COM4发送的数据到达了COM3的接收区域,从而实现了COM3与COM4之间的互联互通。 到这虚拟串口已经设置好,对其它设计软件而言,虚拟串口和普通串口没有区别,如串口调试助手对虚拟串口的使用和普通串口的使用方法一样。二,虚拟串口在Proteus中的使用 下一步介绍一下虚拟串口在Proteus中的使用,更准确的应该说是“串口在Proteus中的使用”,只不过我们用软件实现仿真,虚拟串口在这使用的比较频繁。

先在Proteus中将环境建立起来,很简单,先需要两个元器件就可以建立连接VIRTUAL TERMINAL和COMPIM,如图VIRTUAL TERMINAL的TXD与COMPIM 的TXD相连,RXD与RXD相连,后面有图分析为什么这样相连: VIRTUAL TERMINAL是串口监视仪器,可以通过它将数据线上的符合RS232协议的波形捕捉到,并显示出来,也可以往数据线上发送RS232协议的波形;COMPIM为串口元件,可设置占用计算机上哪一个串口,可以是“实际串口”,也可以是“虚拟串口”,对Proteus而言,是分不清虚拟串口还是实际串口的。下一步就要设置通信速率以及通信格式了,在属性框中实现设置相同的就行了。这样就可实现数据的通信了。图为本人的VIRTUAL TERMINAL和COMPIM的设置:

相关主题
文本预览
相关文档 最新文档