文档库 最新最全的文档下载
当前位置:文档库 › VC++编写GPS的串口通信

VC++编写GPS的串口通信

VC++编写GPS的串口通信
VC++编写GPS的串口通信

VC++编写GPS的串口通信

作者: ths. 本文可以转载,请以超链接标明原始出处和作者信息及版权声明

网址: https://www.wendangku.net/doc/93240505.html,/?p=347

::源代码:: GPS通信

真的好多事情,这个代码也是半年前写的了,拿出来贴贴。

阅读此文之前,如果你还不知道如何编写VC++的串口通信,那么你可以先看我的这篇文章:VC++编写串口通信.

GPS(Golbal Position System)全球定位系统是一个在做一些项目中很常用到的仪器,它通过卫星的通信可以返回给你你当前所处的时间,时区,经纬度等等。VC++编写GPS通信是属于典型的基本的串口通信例子,而且只用接收信息即可,不用对GPS发送信息。

编写通信的方法的前半部分都跟我上篇文章说的串口通信一样,即注册ActiveX,建立实例及事件的映射等等。完成上面的操作后,你就可以接收的GPS 发来的信息了。

CGPSDlg::CGPSDlg(CWnd* pParent/*=NULL*/)

: CDialog(CGPSDlg::IDD, pParent)

{

m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

m_port = 1; //端口号设置为1

m_strset = _T("38400, n, 8, 1");//串口参数,波特率:38400, 8为数据位,1为停止位m_inputBuffer = _T(""); //清空输入缓冲区

m_str = _T("");

}

void CGPSDlg::OnBnClickedButton1()

{

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

-

m_str = _T("");

//如果端口原来打开,则需要先关闭

if(m_comm.get_PortOpen())

m_comm.put_PortOpen(FALSE);

//设置连接参数

m_comm.put__CommPort(m_port); //指定串口号

m_comm.put_Settings(m_strset); //通信参数设置

m_comm.put_InBufferSize(1024); //指定接收缓冲区大小

m_comm.put_InBufferCount(0); //清空输入缓冲区

m_comm.put_InputMode(0); //文本模式获取数据

m_comm.put_InputLen(0); //读取缓冲区的全部数据

m_comm.put_RThreshold(1); //设置在产生OnComm事件前要接收的字符数阈值

//打开端口连接

if(!m_comm.get_PortOpen())

m_comm.put_PortOpen(TRUE);

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

}

但因为GPS发送来的信息是源源不断的帧数据,如果你直接阅读这些帧数据,你会发现根本无法阅读。所以接下来的关键一步就是对GPS的帧数据的格式分析,筛选出有用的数据。要筛选数据,首先你必须明白GPS的帧格式,这里我就不说了,你去看我百度 Hi里以前收集的这篇文章《VC++实现GPS全球定位系统定位数据的提取》

其实数据的提取就是对接收过来的字符串进行分析,个人认为比较可简洁高

效的方法是正则表达式法。但我当时使用的是最土的逐字分析法,先查找$帧开头,得到一个帧数据后再对这个帧数据分析,反正就是写得很”猥琐”,不过这么写起来也不难就是了。因为方法太土,也就没有什么好讲的了,自己看代码。

void CGPSDlg::OnCommMscomm1()

{

CString str = _T("");

VARIANT var_in;

CString strtemp;

if(m_comm.get_CommEvent() == 2){//事件值为2表示接收缓冲区内有字符var_in = m_comm.get_Input(); //读缓冲区

m_str += var_in.bstrVal; //转换成CString类型

if(m_str.GetLength() > 100){

//如果端口原来打开,则需要先关闭

if(m_comm.get_PortOpen())

m_comm.put_PortOpen(FALSE);

//数据存放变量

CString GpsTime, GpsPosWei, GpsDirWei, GpsPosJing, GpsDirJing, GpsDate;

//从m_str中读取时间和经纬度

int start = 0, end = 0;

if((start = m_str.Find(_T("$GPRMC"))) >= 0){

end = m_str.Find('$', start + 1);

if(end > start){

int index = 0;

//截取得数据帧

strtemp = m_str.Mid(start, end - start);

((CListBox *)GetDlgItem(IDC_LIST1))->InsertString(0,strtemp);

UpdateWindow();

m_str = _T("");

//GetDlgItem(IDC_STATIC1)->SetWindowTextW(strtemp);

start= end = 0;

while(index <=12){

++ index;

end = strtemp.Find(',', start); //end指向第index个逗号

switch(index){

case2://读得格林威治时间

GpsTime = strtemp.Mid(start, end - start);

break;

case4://读得纬度

GpsPosWei = strtemp.Mid(start, end - start);

break;

case5://读得纬度方向

GpsDirWei = strtemp.Mid(start, end - start);

break;

case6://读得经度

GpsPosJing = strtemp.Mid(start, end - start);

case7://读得经度方向

GpsDirJing = strtemp.Mid(start, end - start);

break;

case10://读得当前日期

GpsDate = strtemp.Mid(start, end - start);

break;

}

start = end + 1;

}

//格林威治时间转化为北京时间,时钟加8小时

int hour = (GpsTime[0] - '0') * 10 + (GpsTime[1] - '0') + 8; hour %= 24;

//获取GpsTime得Buffer,并对其进行写操作

LPTSTR ptr = GpsTime.GetBuffer(30);

if(hour < 10)ptr[0] = '0';

else ptr[0] = hour / 10 + '0';

ptr[1] = hour % 10 + '0';

GpsTime.ReleaseBuffer();

//合并日期和时间

CString tmp =_T("北京时间: ");

tmp += GpsDate[4];

tmp += GpsDate[5];

tmp += '-';

tmp += GpsDate[2];

tmp += GpsDate[3];

tmp += '-';

tmp += GpsDate[0];

tmp += GpsDate[1];

tmp += ' ';

int i, j;

for(i = j = 0;j < GpsDate.GetLength();++ i){

char c = (CHAR)((i % 3 == 2) ? ':' : GpsTime[j++]);

tmp += c;

}

//AfxMessageBox(m_str);

//AfxMessageBox(strtemp);

AfxMessageBox(tmp);

//AfxMessageBox(GpsTime + _T("\n\r") + GpsPosWei + _T("\n\r") + GpsDirWei

// + _T("\n\r") + GpsPosJing + _T("\n\r") + GpsDirJing + _T("\n\r") + GpsDate);

}

}

}

}

}

在分析数据的时候有几点需要注意一下:

1.我们出在东八区,所以北京时间是格林威治时间再+8个小时,不然这个容易写错。

2.如果你的GPS的质量不好或者你所处的位置的信号不好,往往会接收不到的所在位

置的经纬度。这里尝尝会误认为是自己数据分析错了。记得当初我也在这里出过问题,弄我火了抱起电脑跑到老校区的科学喽15楼顶去测,发现是信号不好的问题,我的程序是yes的。

其它也就没有什么了,至于显示,我是采用CListBox进行显示的,这样就可以通过CListBox信息变化考到接收过来的gps信息了。

RS232串口通信实验报告

RS232串口通信实验报告 学院:电子信息学院 班级:08031102 姓名:张泽宇康启萌余建军 学号:2011301966 2011301950 2011301961 时间:2014年11月13日 学校:西北工业大学

一.实验题目: 设计一个简单的基于串口通信的信息发送和接受界面 二.实验目的: 1.熟悉并掌握RS232串口标准及原理。 2.实现PC机通过RS232串口进行数据的收发。 3.熟悉VC语言编写程序的环境,掌握基本的VC语言编程技巧。 三.实验内容 程序代码: P// PC1PC2Dlg.cpp : implementation file // #include "stdafx.h" #include "PC1PC2.h" #include "PC1PC2Dlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ////////////////////////////////////////////////////////////////////////// // CAboutDlg dialog used for App About class CAboutDlg : public CDialog { public: CAboutDlg(); // Dialog Data //{{AFX_DATA(CAboutDlg) enum { IDD = IDD_ABOUTBOX }; //}}AFX_DATA // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CAboutDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL

RS232串口通信详解

计 协议 --------------------------------- 9 来 缩写 1调 调 CD载 检测 2调 调 RXD 数 3PC TXD 数 4PC DTR数 终 5GND 6调 调 DSR 讯 7PC RTS请 8调 调 CTS 许 9调 调 RI 连 时 数 针 数 针 连 对应 --------------------------------- 1 RS-23 2 远 50 2 RS232 传 讯 传 20kbps 3 RS-232C 传 数 负逻辑 对称 逻辑1 -3 -15V 逻辑0 +3 +15V 单 连 时 转换

--------------------------------- 数 a RS-232-C标 规 数 传 为 50 75 100 150 300 600 1200 2400 4800 9600 19200 b 数 标 5 7 8 传 标 ASCII码 0 127 7 扩 ASCII码 0 255 8 c 单 为1 1.5 2 数 传 线 时 时 现 仅仅 传 结 计 时 d 验 简单 检错 对 验 验 数 传 数 逻辑 数 011 对 验 验 为0 证逻辑 数 数 验 验 1 这 3 逻辑 --------------------------------- 传 线 闲时 线 TTL RS232 数 开 RS232线 为 结 时Rs232为 数 传 读数时 数 对 16进 数 55aaH 当 8 数 1 传 时 线 图1(TTL ) 图 2(RS-232 ) 55H=01010101B 10101010B 1 0 55H 数 为1010101010B aaH=10101010B 01010101B 1 0 55H 数 为1101010100B

C语言串口通信助手代码

该程序全部由C写成没有C++ 更没用MFC 完全是自娱自乐给需要的人一个参考 #include "stdafx.h" #include #include "resource.h" #include "MainDlg.h" #include #include #include HANDLE hComm;//用于获取串口打开函数的返回值(句柄或错误值)OVERLAPPED m_ov; COMSTAT comstat; DWORD m_dwCommEvents;

TCHAR cRecs[200],cSends[100]; //接收字符串发送字符串 char j=0,*cCom; //接收用统计数据大小变量端口选择 BOOL WINAPI Main_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch(uMsg) { HANDLE_MSG(hWnd, WM_INITDIALOG, Main_OnInitDialog); HANDLE_MSG(hWnd, WM_COMMAND, Main_OnCommand); HANDLE_MSG(hWnd,WM_CLOSE, Main_OnClose); } return FALSE; } /*系统初始化函数*/ BOOL Main_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam) { HWND hwndCombo1=GetDlgItem(hwnd,IDC_COMBO1); ComboBox_InsertString(hwndCombo1,-1,TEXT("COM1")); ComboBox_InsertString(hwndCombo1,-1,TEXT("COM2"));

VC与c51串口通讯程序

跟着步骤学习 1.建立项目:打开VC++6.0,建立一个基于对话框的MFC应用程序SCommTest 2.在项目中插入MSComm控件选择Project菜单下Add To Project子菜单中的 Components and Controls…选项,在弹出的对话框中双击Registered ActiveX Controls项(稍等一会,这个过程较慢),则所有注册过的ActiveX控件出现在列表框中。选择Microsoft Communications Control, version 6.0,,单击Insert按钮将它插入到我们的Project中来,接受缺省的选项。(如果你在控件列表中看不到Microsoft Communications Control, version 6.0,那可能是你在安装VC6时没有把ActiveX一项选上,重新安装VC6,选上ActiveX就可以了), 这时在ClassView视窗中就可以看到CMSComm类了,(注意:此类在ClassWizard中看不到,重构clw 文件也一样),并且在控件工具栏Controls中出现了电话图标(如图1所示),现在要做的是用鼠标 将此图标拖到对话框中,程序运行后,这个图标是看不到的。 3.利用ClassWizard定义CMSComm类控制对象打开ClassWizard ->Member Viariables选项卡,选择CSCommTestDlg类,为IDC_MSCOMM1 添加控制变量:m_ctrlComm,这时你可以看一看,在对话框头文件中自动 加入了//{{AFX_INCLUDES() #include "mscomm.h" //}}AFX_INCLUDES (这时运行程序,如果有错,那就再从头开始)。 4.在对话框中添加控件向主对话框中添加两个编辑框,一个用于接收显 示数据ID为IDC_EDIT_RXDATA,另一个用于输入发送数据,ID为 IDC_EDIT_TXDATA,再添加一个按钮,功能是按一次就把发送编辑框中的内 容发送一次,将其ID设为IDC_BUTTON_MANUALSEND。别忘记了将接收编辑 框的Properties->Styles中把Miltiline和Vertical Scroll属性选上,发送编辑框若你想输入多行文字,也可选上Miltiline。 再打开ClassWizard->Member Viariables选项卡,选择CSCommTestDlg类,为IDC_EDIT_RXDATA 添加CString变量m_strRXData,为IDC_EDIT_TXDATA添加CString变量m_strTXData。说明: m_strRXData和m_strTXData分别用来放入接收和发送的字符数据。 5.添加串口事件消息处理函数OnComm()打开ClassWizard->Message Maps,选择类CSCommTestDlg,选择IDC_MSCOMM1,双击消息OnComm,将弹出的对话框中将函数名改为OnComm,(好记而已)OK。 这个函数是用来处理串口消息事件的,如每当串口接收到数据,就会产生一个串口接收数据缓冲区中有字符的消息事件,我们刚才添加的函数就会执行,我们在OnComm()函数加入相应的处理代码就能实现自已想要的功能了。请你在函数中加入如下代码: void CSCommTestDlg::OnComm() { // TODO: Add your control notification handler code here VARIANT variant_inp; COleSafeArray safearray_inp; LONG len,k; BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed. CString strtemp; if(m_ctrlComm.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符 { ////////以下你可以根据自己的通信协议加入处理代码 variant_inp=m_ctrlComm.GetInput(); //读缓冲区 safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量 len=safearray_inp.GetOneDimSize(); //得到有效数据长度 for(k=0;k

RS232串口通信

RS232串口通信小结 在Microsoft Windows下开发串口通信程序通常有如下几种方法: 利用wIndowsAPI 通信函数。 利用Windows 的读写端口函处_inp,-inpw,_inpd,_outp,_outpw,_outpd(Windows 95系列下)或开发驱动程序(Windows NT系列下)直接对串口进行操作。 利用第三方提供或自己编写的通信类. 使用串口通信组件,如ActiveX控件MSComm。 以下几种方法中第一种(即API函数法)使用面较广,但由于比较复杂,使用较困难。第二种需要了解硬件电路结构原理,深入驱动层次,专业化程度较高。第三种方法使用面向对象技术封装W1n32API函数,提供一个用于串行通信的类,只要理解这种类的几个成员函数,就能方使地使用,但编写能普通应用的这种类相当困难。第四种方法较简单,只需要对串口进行简单配置,唯一比较困难的地方在于令人费解的V ARIANT类。 以下只简单介绍第一种(利用Windows API函数)和第四种(使用串口通信组件)方法API函数法(即第一种方法)可以说是在Windows环境下编写串口通信程序的基本方法,下面介绍的大部分内容对于其他3种方法都能适用。 第一种:API函数法 1.API函数法 与以往DOS下串口通信程序不同的是,Windows不提倡应用程序直接控制硬件,而是通过Windows操作系统提供的设备驱动程序来进行数据传递。串行口在WED32中是作为文件来进行处理的,而不是直接对端口进行操作,对于串行通信,Win32提供了相应的文件I/O函数与通信函数,通过了解这些函数的使用,可以编制出符合不同需要的通信程序。 API是附带在Windows内部的一个极其重要的组成部分。Windows的32位API主要是一系列很复杂的函数和消息集合,它可以看作是Windows系统为在其下运行的各种开发系统提供的开放式通用功能增强接口。与串口通信有关的Windows API函数大概有20多个,如下所示: BuildCommDCB BuildCommDCBAndTimeouts ClearCommBreak ClearCommError CommConfigDialog EscapeCommFunction GetCommConfig GetCommMask GetCommModemStatus GetCommProperties GetCommState GetCommTimeouts GetDefaultCommConfig PurgeComm SetCommBreak SetCommConfig SetCommMask SetCommState

c语言串口通信范例

一个c语言的串口通信程序范例 分类:技术笔记 标签: c语言 串口通信 通信程序 it 最近接触一个项目,用HL-C1C激光位移传感器+易控组态软件完成生产线高度跳变检测,好久没有接触c c#,一些资料,找来做个记录,也许大家用的着 #include #include #include #include #define COM232 0x2f8 #define COMINT 0x0b #define MaxBufLen 500 #define Port8259 0x20 #define EofInt 0x20 static int comportaddr; static char intvectnum; static unsigned char maskb; static unsigned char Buffer[MaxBufLen]; static int CharsInBuf,CircIn,CircOut; static void (interrupt far *OldAsyncInt)();

static void interrupt far AsyncInt(void); void Init_COM(int ComPortAddr, unsigned char IntVectNum, int Baud, unsigned char Data, unsigned char Stop, unsigned char Parity) { unsigned char High,Low; int f; comportaddr=ComPortAddr; intvectnum=IntVectNum; CharsInBuf=0;CircIn=0;CircOut=0; f=(Baud/100); f=1152/f; High=f/256; Low=f-High*256; outp(ComPortAddr+3,0x80); outp(ComPortAddr,Low); outp(ComPortAddr+1,High); Data=(Data-5)|((Stop-1)*4); if(Parity==2) Data=Data|0x18; else if(Parity==1) Data=Data|0x8; outp(ComPortAddr+3,Data); outp(ComPortAddr+4,0x0a);

RS232串口通信详解

串口是计算机上一种非常通用的设备通信协议。 --------------------------------- 串口的引脚定义: 两个串口连接时,接收数据针脚与发送数据针脚相连,彼此交叉,信号地对应相接即可。--------------------------------- 串口的电气特性: 1)RS-232串口通信最远距离是50英尺 2)RS232可做到双向传输,全双工通讯,最高传输速率20kbps 3)RS-232C上传送的数字量采用负逻辑,且与地对称 逻辑1:-3 ~-15V 逻辑0:+3~+15V 所以与单片机连接时常常需要加入电平转换芯片:

--------------------------------- 串口通信参数: a)波特率:RS-232-C标准规定的数据传输速率为每秒50、75、100、150、300、600、1200、2400、 4800、9600、19200波特。b)数据位:标准的值是5、7和8位,如何设置取决于你想传送的信息。比如,标准的ASCII码是0~127(7位);扩展的ASCII码是0~255(8位)。 c)停止位:用于表示单个包的最后一位,典型的值为1,1.5和2位。由于数是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。d)奇偶校验位:在串口通信中一种简单的检错方式。对于偶和奇校验的情况,串口会设置校验位(数据位后面的一位),用一个值确保传输的数据有偶个或者奇个逻辑高位。例如,如果数据是011,那么对于偶校验,校验位为 0,保证逻辑高的位数是偶数个。如果是奇校验,校验位位1,这样就有3个逻辑高位。 --------------------------------- 串口通信的传输格式:串行通信中,线路空闲时,线路的TTL电平总是高,经反向RS232的电平总是低。一个数据的开始RS232线路为高电平,结束时Rs232为低电平。数据总是从低位向高位一 位一位的传输。示波器读数时,左边是数据的高位。 例如,对于16进制数据55aaH,当采用8位数据位、1位停止位传输时,它在信号线上的波形如图1(TTL电平)和图 2(RS-232电平)所示。 55H=01010101B,取反后10101010B,加入一个起始位1,一个停止位0,55H的数据格式为1010101010B; aaH=10101010B,取反后01010101B,加入一个起始位1,一个停止位0,55H的数据格式为1101010100B;

VC6.0MFC串口通信编写全过程(DOC)

其于MFC 的串口调试助手编辑过程 一、新建 打开 VC6.0 文件 新建 工程 MFC AppWiard(exe) 位置(选择保存工程位置) 工程名称(输入工程名XXXX ) 确定 选择基本对话框 下一步 下一步 下一步 选择(CXXXXDlg ) 完成 确定 在生成的基本对话框内将不需要按钮及提示框(自动生成的“确定”“取消” 及提示框)删除或修改使用,至此基本框架完成如下图: 二、往生成的基本框架中添加控件 1、因为控件列表框内没有串口通信用到的通信控件,所以要先添加到控件列表框内再将控件添加到基本框内使用,步骤如下: 菜单栏 工程 添加到工程 Components and controls … Registered ActiveX Controls 选择“Microsoft Communications Control, version 6.0” Insert 确定 OK 关闭此子窗口完成添加操作标志如上图所示。 2、将刚才添加添加到控件列表框内的串口控件添加到基本框架内 点击控件列表框内的串口控件,此时光标变为“十”形,在基本框架内随意划取一矩 形区域,即可以添加串口控件,不需要修改此控件的大小及位置,因为程编译运行后此控件是看不到的,步骤结果如下图:

3、继续往基本框架内添加用于编辑发送数据的输入编辑框及输出编辑框,同理选择控件列表框内的“编辑框控件”,以相同的操作即可添加两个编辑窗口及一个按纽控件如下图所示: 这两个窗口需要修改大小及位置,因为程序运行后将会显示而串口通信控件则不显示,上图是运行后的效果。 4、对以上四个控件编程步骤如下: a 、右击串口通信控件 建立类向导 Member variables Control IDS 中选择IDC_MSCOMM1 add variable … Member variable name 中输入控件变量名m_ctrlComm (变量名可以随意选取,但程序中应与所取变量名一致) OK 确定

RS232串口通讯详解

串口通讯—RS-232-C详解 蓝鸟发表于 2005-9-22 16:19:34 串行通信接口标准经过使用和发展,目前已经有几种。但都是在RS-232标准的基础上经过改进而形成的。所以,以RS-232C为主来讨论。RS-323C标准是美国EIA(电子工业联合会)与BELL等公司一起开发的1969年公布的通信协议。它适合于数据传输速率在0~20000b/s范围内的通信。这个标准对串行通信接口的有关问题,如信号线功能、电器特性都作了明确规定。由于通行设备厂商都生产与RS-232C制式兼容的通信设备,因此,它作为一种标准,目前已在微机通信接口中广泛采用。 在讨论RS-232C接口标准的内容之前,先说明两点: 首先,RS-232-C标准最初是远程通信连接数据终端设备DTE(Data Terminal Equipment)与数据通信设备DCE(Data Communication Equipment)而制定的。因此这个标准的制定,并未考虑计算机系统的应用要求。但目前它又广泛地被借来用于计算机(更准确的说,是计算机接口)与终端或外设之间的近端连接标准。显然,这个标准的有些规定及和计算机系统是不一致的,甚至是相矛盾的。有了对这种背景的了解,我们对RS-232C标准与计算机不兼容的地方就不难理解了。 其次,RS-232C标准中所提到的“发送”和“接收”,都是站在DTE立场上,而不是站在DCE的立场来定义的。由于在计算机系统中,往往是CPU和I/O设备之间传送信息,两者都是DTE,因此双方都能发送和接收。 一、RS-232-C RS-232C标准(协议)的全称是EIA-RS-232C标准,其中EIA(Electronic Industry Association)代表美国电子工业协会,RS(ecommeded standard)代表推荐标准,232是标识号,C代表RS232的最新一次修改(1969),在这之前,有RS232B、RS232A。。它规定连接电缆和机械、电气特性、信号功能及传送过程。常用物理标准还有有EIA�RS-232-C、EIA�RS-422-A、 EIA�RS-423A、EIA�RS-485。这里只介绍EIA�RS-232-C(简称232,RS232)。例如,目前在IBM PC机上的COM1、COM2接口,就是RS-232C接口。 1.电气特性 EIA-RS-232C对电器特性、逻辑电平和各种信号线功能都作了规定。 在TxD和RxD上:逻辑1(MARK)=-3V~-15V 逻辑0(SPACE)=+3~+15V 在RTS、CTS、DSR、DTR和DCD等控制线上: 信号有效(接通,ON状态,正电压)=+3V~+15V 信号无效(断开,OFF状态,负电压)=-3V~-15V

c语言串口通信范例

c语言串口通信范例 This manuscript was revised by the office on December 22, 2012

一个c语言的串口通信程序范例 标签:分类: 最近接触一个项目,用HL-C1C激光位移传感器+易控组态软件完成生产线高度跳变检测,好久没有接触c c#,一些资料,找来做个记录,也许大家用的着 #include <> #include <> #include <> #include <> #define COM232 0x2f8 #define COMINT 0x0b #define MaxBufLen 500 #define Port8259 0x20 #define EofInt 0x20

static int comportaddr; static char intvectnum; static unsigned char maskb; static unsigned char Buffer[MaxBufLen]; static int CharsInBuf,CircIn,CircOut; static void (interrupt far *OldAsyncInt)(); static void interrupt far AsyncInt(void); void Init_COM(int ComPortAddr, unsigned char IntVectNum, int Baud, unsigned char Data, unsigned char Stop, unsigned char Parity) { unsigned char High,Low; int f; comportaddr=ComPortAddr; intvectnum=IntVectNum; CharsInBuf=0;CircIn=0;CircOut=0; f=(Baud/100);

基于VerilogHDL的RS-232串口通信在CPLD上的实现综述

基于Verilog的RS-232串口通信在CPLD上的实现 CPLD(Complex Programable Logic Device)是一种复杂的用户可编程逻辑器件。采用连续连接结构,延时可预测,从而使电路仿真更加准确。CPLD 是标准的大规模集成电路产品,可用于各种数字逻辑系统的设计。开发工具Quartus II、ISE等功能强大,编程语言灵活多样,使设计开发缩短了周期。 随着嵌入式的发展,对数据的传输和人机交互通信的要求越来越高。而串口通信因其资源消耗少、技术成熟而被广泛应用。系统中上位机与嵌入式芯片之间的交互通信可以通过专用集成芯片作为外设RS-232异步串行接口,如TI、EXAR、EPIC公司的550、452等系列UAWT集成电路,或在拥有Nios系统的FPGA上可以方便地嵌入UART模块。但是在设计中用户会提出自己的要求,如:数据加密或只使用UART部分功能等,即要求更灵活的UART。而且有时CPLD资源剩余,出于成本考虑也会要求设计一种模拟的UART。对于上述的两种情况,就可以在CPLD其丰富的资源上制作一款UART,实现PC机与嵌入式系统之间的数据交换。 1 串口通信协议 1.1 UART简介 通用异步收发器(Universal Asynchronous Receiver Transmitter,UART)。

异步通信的特点:不要求收发双方时钟的严格一致,实现容易,设备开销较小。具有相关工业标准提供的标准的接口电平规范等优点,在工业控制领域被广泛采用。 异步通信一帧字符信息由4部分组成:起始位、数据位、奇偶校验位和停止位。 本设计基于RS-232的数据帧结构,设置数据帧结构如图1所示:1 bit起始位,8 bit数据位,1 bit停止位,无校验位。每帧实质上传送1 Byte数据。 1.2 自定义数据包格式 多个上文所描述的帧就可以组成一个数据包。串口通信是在RS-232数据帧结构的基础上定义的,传输以数据包为单位进行。包结构如图2所示。 本文采用和校验的结构,一个数据包包含15 Byte。其中第1个字节是数据包头即握手字符。第2字节为控制字符,EE代表写命令,DD代表读命

VC++_串口上位机编程实例

VC++串口上位机简单例程(源码及详细步骤) (4.33MB) VC++编写简单串口上位机程序 2010年4月13日10:23:40 串口通信,MCU跟PC通信经常用到的一种通信方式,做界面、写上位机程序的编程语言、编译环境等不少,VB、C#、LABVIEW等等,我会的语言很少,C语言用得比较多,但是还没有找到如何用C语言来写串口通信上位机程序的资料,在图书管理找到了用VC++编写串口上位机的资料,参考书籍,用自己相当蹩脚的C++写出了一个简单的串口上位机程序,分享一下,体验一下单片机和PC通信的乐趣。 编译环境:VC++6.0 操作系统:VMWare虚拟出来的Windows XP 程序实现功能: 1、PC初始化COM1口,使用n81方式,波特率57600与单片机通信。PC的COM口编号可以通过如下方式修改: 当然也可以通过上位机软件编写,通过按钮来选择COM端口号,但是此次仅仅是简单的例程,就没有弄那么复杂了。COM1口可用的话,会提示串口初始化完毕。否则会提示串口已经打开Port already open,表示串口已经打开,被占用了。 2、点击开始转换,串口会向单片机发送0xaa,单片机串口中断接收到0xaa后启动ADC转

换一次,并把转换结果ADCL、ADCH共两个字节的结果发送至PC,PC进行数值转换后在窗口里显示。(见文章末尾图) 3、为防止串口被一只占用,点击关闭串口可以关闭COM1,供其它程序使用,点击后按钮变为打开串口,点击可重新打开COM1。 程序的编写: 1、打开VC++6.0建立基于对话框的MFC应用程序Test,

2、在项目中插入MSComm控件:工程->增加到工程->Components and Controls->双击Registered ActiveX Controls->选择Microsoft Communications Control,version6.0->Insert,按

C语言串口通信-源代码

#include #include #include #include #define COM232 0x2f8 #define COMINT 0x0b #define MaxBufLen 500 #define Port8259 0x20 #define EofInt 0x20 static int comportaddr; static char intvectnum; static unsigned char maskb; static unsigned char Buffer[MaxBufLen]; static int CharsInBuf,CircIn,CircOut; static void (interrupt far *OldAsyncInt)(); static void interrupt far AsyncInt(void); void Init_COM(int ComPortAddr, unsigned char IntVectNum, int Baud, unsigned char Data, unsigned char Stop, unsigned char Parity) { unsigned char High,Low; int f; comportaddr=ComPortAddr; intvectnum=IntVectNum; CharsInBuf=0;CircIn=0;CircOut=0; f=(Baud/100); f=1152/f; High=f/256; Low=f-High*256; outp(ComPortAddr+3,0x80); outp(ComPortAddr,Low); outp(ComPortAddr+1,High); Data=(Data-5)|((Stop-1)*4); if(Parity==2) Data=Data|0x18; else if(Parity==1) Data=Data|0x8; outp(ComPortAddr+3,Data);

(完整版)VC6.0MFC串口通信编写全过程

其于MFC的串口调试助手编辑过程 一、新建 打开VC6.0 文件新建工程MFC AppWiard(exe) 位置(选择保存工程位置)工程名称(输入工程名XXXX)确定选择基本对话框下一步下一步下一步选择(CXXXXDlg)完成确定在生成的基本对话框内将不需要按钮及提示框(自动生成的“确定”“取消”及提示框)删除或修改使用,至此基本框架完成如下图: 二、往生成的基本框架中添加控件 1、因为控件列表框内没有串口通信用到的通信控件,所以要先添加到控件列表框内再 将控件添加到基本框内使用,步骤如下: 菜单栏工程添加到工程Components and controls…Registered ActiveX Controls 选择“Microsoft Communications Control, version 6.0”Insert 确定OK 关闭此子窗口完成添加操作标志如上图所示。 2、将刚才添加添加到控件列表框内的串口控件添加到基本框架内 点击控件列表框内的串口控件,此时光标变为“十”形,在基本框架内随意划取一矩形区域,即可以添加串口控件,不需要修改此控件的大小及位置,因为程编译运行后此控件是看不到的,步骤结果如下图:此控件(标志)是下面步骤添加进来的串口控件 基本框架

3、继续往基本框架内添加用于编辑发送数据的输入编辑框及输出编辑框,同理选择控 件列表框内的“编辑框控件”,以相同的操作即可添加两个编辑窗口及一个按纽控件如 下图所示: 选择其中任 意一个作为 输入编辑框 及输出编辑 框 这两个窗口需要修改大小及位置,因为程序运行后将会显示而串口通信控件则不显示, 上图是运行后的效果。 4、对以上四个控件编程步骤如下: a、右击串口通信控件建立类向导Member variables Control IDS中选 择IDC_MSCOMM1 add variable…Member variable name中输入控件变量名 m_ctrlComm(变量名可以随意选取,但程序中应与所取变量名一致)OK 确 定

RS232串口通信详解

串口就是计算机上一种非常通用的设备通信协议。 --------------------------------- 串口的引脚定义: 9芯信号方向来自缩写描述 1调制解调器CD载波检测 2调制解调器RXD接收数据 3PC TXD发送数据 4PC DTR数据终端准备好 5GND信号地 6调制解调器DSR通讯设备准备好 7PC RTS请求发送 8调制解调器CTS允许发送 9调制解调器RI响铃指示器 两个串口连接时,接收数据针脚与发送数据针脚相连,彼此交叉,信号地对应相接即可。--------------------------------- 串口的电气特性: 1)RS-232串口通信最远距离就是50英尺 2)RS232可做到双向传输,全双工通讯,最高传输速率20kbps 3)RS-232C上传送的数字量采用负逻辑,且与地对称 逻辑1:-3 ~-15V 逻辑0:+3~+15V 所以与单片机连接时常常需要加入电平转换芯片:

--------------------------------- 串口通信参数: a)波特率:RS-232-C标准规定的数据传输速率为每秒50、75、100、150、300、600、1200、2400、 4800、9600、19200波特。b)数据位:标准的值就是5、7与8位,如何设置取决于您想传送的信息。比如,标准的ASCII码就是0~127(7位);扩展的ASCII码就是0~255(8位)。 c)停止位:用于表示单个包的最后一位,典型的值为1,1、5与2位。由于数就是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅就是表示传输的结束,并且提供计算机校正时钟同步的机会。d)奇偶校验位:在串口通信中一种简单的检错方式。对于偶与奇校验的情况,串口会设置校验位(数据位后面的一位),用一个值确保传输的数据有偶个或者奇个逻辑高位。例如,如果数据就是011,那么对于偶校验,校验位为 0,保证逻辑高的位数就是偶数个。如果就是奇校验,校验位位1,这样就有3个逻辑高位。 --------------------------------- 串口通信的传输格式: 串行通信中,线路空闲时,线路的TTL电平总就是高,经反向 RS232的电平总就是低。一个数据的开始RS232线路为高电平,结束时Rs232为低电平。数据总就是从低位向高位一位一位的传输。示波器读数时,左边就是数据的高位。 例如,对于16进制数据55aaH,当采用8位数据位、1位停止位传输时,它在信号线上的波形如图1(TTL电平)与图 2(RS-232电平)所示。 55H=01010101B,取反后10101010B,加入一个起始位1,一个停止位0,55H的数据格式为1010101010B; aaH=10101010B,取反后01010101B,加入一个起始位1,一个停止位0,55H的数据格式为1101010100B;

RS232串口通信详解

. 串口是计算机上一种非常通用的设备通信协议。 --------------------------------- 串口的引脚定义: 9芯信号方向来自缩写描述 1调制解调器CD载波检测 2调制解调器RXD接收数据 3PC TXD发送数据 4PC DTR数据终端准备好 5GND信号地 6调制解调器DSR通讯设备准备好 7PC RTS请求发送 8调制解调器CTS允许发送 9调制解调器RI响铃指示器 两个串口连接时,接收数据针脚与发送数据针脚相连,彼此交叉,信号地对应相接即可。--------------------------------- 串口的电气特性: 1)RS-232串口通信最远距离是50英尺 2)RS232可做到双向传输,全双工通讯,最高传输速率20kbps 3)RS-232C上传送的数字量采用负逻辑,且与地对称 逻辑1:-3 ~-15V 逻辑0:+3~+15V 所以与单片机连接时常常需要加入电平转换芯片:

--------------------------------- 串口通信参数: a)波特率:RS-232-C标准规定的数据传输速率为每秒50、75、100、150、300、600、1200、2400、 4800、9600、19200波特。b)数据位:标准的值是5、7和8位,如何设置取决于你想传送的信息。比如,标准的ASCII码是0~127(7位);扩展的ASCII码是0~255(8位)。 c)停止位:用于表示单个包的最后一位,典型的值为1,1.5和2位。由于数是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。d)奇偶校验位:在串口通信中一种简单的检错方式。对于偶和奇校验的情况,串口会设置校验位(数据位后面的一位),用一个值确保传输的数据有偶个或者奇个逻辑高位。例如,如果数据是011,那么对于偶校验,校验位为 0,保证逻辑高的位数是偶数个。如果是奇校验,校验位位1,这样就有3个逻辑高位。 --------------------------------- 串口通信的传输格式:串行通信中,线路空闲时,线路的TTL电平总是高,经反向RS232的电平总是低。一个数据的开始RS232线路为高电平,结束时Rs232为低电平。数据总是从低位向高位一 位一位的传输。示波器读数时,左边是数据的高位。 例如,对于16进制数据55aaH,当采用8位数据位、1位停止位传输时,它在信号线上的波形如图1(TTL电平)和图 2(RS-232电平)所示。 55H=01010101B,取反后10101010B,加入一个起始位1,一个停止位0,55H的数据格式为1010101010B; aaH=10101010B,取反后01010101B,加入一个起始位1,一个停止位0,55H的数据格式为1101010100B;

RS232+RS485实现通讯实验板

RS232+RS485实现通讯实验板 1 引言 计算机控制系统中经常采用多机系统进行通信,在由PC机和单片机构成的分布式控制系统中,往往以PC机为上位机完成较为复杂的数据处理和对前沿机的监督管理,以及对下位机进行多机协调,本文介绍一种将 RS232,RS485,及红外接口集成在一起的PC机--单片机多功能通讯实验板,用于实现PC机与单片机间的串口通信、红外通信及PC机与PC机间的通讯实验。 2 实验板的组成原理与设计 2.1 串行通信 串行通信是指通信的发送方和接收方之间数据信息的传输是在单根数据线,以每次一个二进制位移动的,他的优点是只需一对传输线进行传送信息,因此其成本低,适用于远距离通信,他的缺点是传送速度低,串行通信有异步通行和同步通信两种基本通信方式,同步通信适用于传送速度高的情况,其硬件复杂,而异步通信应用于传送速度在50-19200波特之间,是比较常用的传送方式,在异步通信中,数据是一帧一帧传送的,每一串行帧的数据格式由1位起始位,5-8位的数据位,1位的奇偶校验位(可省略)和1位停止位4部分组成,在串行通信前,发送方和接收方要约定具体的数据格式和波特率(通信协议)。 2.2 AT89C51微控制器 AT89C51单片机系统具有设计简单、性能可靠、功耗低等优点,它为用户预留下足够的软硬件资源,可供用户进行再开发应用,该系统除内部已有的 4K FLASH存储器外,还可以扩展选址64K ROM区和64K RAM区,供用户使用,用户在系统开发时,可以将自己的数据块和程序段、数据表,以若干控制子程序、数据块形式存放于AT89C51单片机的扩展ROM或 RAM 区中,以便系统工作时重复使用和反复调用。 2.3 RS232C通信接口 RS232C是一种电压型总线标准,可用于设计计算机接口与终端或外设之间的连接,以不同的极性的电压表示逻辑值。-3~-25V表示逻辑"1"。+3~+25V表示逻辑"0"。其电平与TTL和CMOS电平是不同的,所以在通信时必须进行电平转换。 2.4 MAX232芯片 MAXIM公司的MAX232/MAX232A接收/发送器是MAXIM公司特别为满足EIA/TEA2232E的标准而设计的,他们在 EIA/TIA2232E标准串行通信接口中日益得到广泛的应用,他们具有功耗低、工作电源为单电源、外接电容仅为0.1μF或1μF,采用双列直插封装形式、接收器输出为三态TTL/CMOS等优越性,为双组RS 232接收发送器,工作电源为+5V,波特率高,仅需外接0.1μF或1μF的电容,其价格低,可在一般需要串行通信的系统中使用,MAX232外围需要 4个电解电容,是内部电源转换所需电容,其取值均为1μF/25V宜选用钽电容并且应尽量靠近芯片。。 2.5 红外发送、接收电路 红外通讯以红外线作为通讯载体,通过红外光在空中的传播来传输数据,他由红外发射器和红外接收器来完成,在发射端,发送的数字信号经过适当的调制编码后,送入电光变换电路,经红外发射管转变为红外脉冲发射到空中;在接收端,红外接收器对接收到的红外光脉冲进行光电变换,解调译码后恢复出原信号。 红外发送电路中采用的红外发射器件是塑封的TSAL6200红外发射二极管,他将周期的电信号转变成一定频率的红外光信号,他是一种时断时续的高频红外脉冲信号,但脉冲串时间长度是恒定的,根据脉冲串之间的间隔大小,表示传输的是数据"0"还是

相关文档
相关文档 最新文档