RS232通信协议源代码
参考一下
int OpenComm(char * commstr,char * boundstr)
{
struct termio t;
char filename[20];
int comid;
#ifndef SCOUNIX_SYS
sprintf(filename, "/dev/tty%s", commstr);
#else
sprintf(filename, "/dev/tty%da", (*commstr) - 'a' + 1);
#endif
comid=(int)(tolower(*commstr)-'a');
if(comid<0||comid>;10)
{
printf("system unable to open %s!\n", filename);
return 0;
}
if((INFO.CommFd[comid] = open(filename, O_RDWR )) < 0)
{
printf("system unable to open %s!\n", filename);
return 0;
};
if(ioctl(INFO.CommFd[comid], TCGETA, &t) < 0)
{
printf("system unable to open %s!\n", filename);
return 0;
};
if(fcntl(INFO.CommFd[comid],F_SETFL,O_NDELAY)<0)
{
printf("system unable to open %s!\n", filename);
return 0;
};
t.c_cflag = CLOCAL | PARENB | CS7 | CREAD |ChkBound(boundstr);
t.c_iflag = IGNCR |BRKINT | IGNPAR | IXON | IXANY | IXOFF;
t.c_oflag = OPOST ;
t.c_lflag = 0;
t.c_line = 0;
t.c_cc[4] = 1;
if(ioctl(INFO.CommFd[comid], TCSETA, &t) < 0)
{
printf("system unable to open %s!\n", filename);
close(INFO.CommFd[comid]);
return 0;
}
printf("system open %s: handle: %d successfully!\n", filename,INFO.CommFd[comid]);
return 1;
}
串口、RS232、COM口
2007年09月07日 星期五 11:03
什么是串口?
------------------------------------------
串口是计算机上一种非常通用设备通信的协议(不要与通用串行总线Universal Serial Bus或者USB混淆)。大多数计算机包含两个基于RS232的串口。串口同时也是仪器仪表设备通用的通信协议;很多GPIB兼容的设备也带有RS232口。同时,串口通信协议也可以用于获取远程采集设备的数据。
串口通信的概念非常简单,串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。它很简单并且能够实现远距离通信。比如IEEE488定义并行通行状态时,规定设备线总常不得超过20米,并且任意两个设备间的长度不得超过2米;而对于串口而言,长度可达1200米。
典型地,串口用于ASCII码字符的传输。通信使用3根线完成: (1)地线,(2)发送,(3)接收。由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据。其他线用于握手,但是不是必须的。串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。对于两个进行通行的端口,这些参数必须匹配:
(a) 波特率: 这是一个衡量通信速度的参数。它表示每秒钟传送的bit的个数。例如300波特表示每秒钟发送300个bit。当我们提到时钟周期时,我们就是指波特率例如如果协议需要4800波特率,那么时钟是4800Hz。这意味着串口通信在数据线上的采样率为4800Hz。通常电话线的波特率为14400,28800和36600。波特率可以远远大于这些值,但是波特率和距离成反比。高波特率常常用于放置的很近的仪器间的通信,典型的例子就是GPIB设备的通信。
(b) 数据位: 这是衡量通信中实际数据位的参数。当计算机发送一个信息包,实际的数据不会是8位的,标准的值是5、7和8位。如何设置取决于你想传送的信息。比如,标准的ASCII码是0~127(7位)。扩展的ASCII码是0~255(8位)。如果数据使用简单的文本(标准 ASCII码),那么每个数据包使用7位数据。每个包是指一个字节,包括开始/停止位,数据位和奇偶校验位。由于实际数据位取决于通信协议的选取,术语 “包”指任何通信的情况。
(c) 停止位: 用于表示单个包的最后一位。典型的值为1,1.5和2位。由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。
(d) 奇偶校验位: 在串口通信中一种简单的检错方式。有四种检错方式: 偶、奇、高和低。当然没有校验位也是可以的。对于偶和奇校验的情况,串口会设置校验位(数据位后面的一位),用一个值确保传输的数据有偶个或者奇个逻辑高位。例如,如果数据是011,那么对于偶校验,校验位为0,保证逻辑高的位数是偶数个。如果是奇校验,校验位位1,这样就有3个逻辑高位。高位和低位不真正的检查数据,简单置位逻辑高或者逻辑低校验。这样使得接收设备能够知道一个位的状态,有机会判断是否有噪声干扰了通信或者是否传输和接收数据是否不同步。
什么是RS-232?
------------------------------------------
RS-232(ANSI/EIA-232标准)是IBM-PC及其兼容机上的串行连接标准。可用于许多用途,比如连接鼠标、打印机或者Modem,同时也可以接工业仪器仪表。用于驱动和连线的改进,实际应用中RS-232的传输长度或者速度常常超过标准的值。RS-232只限于PC串口和设备间点对点的通信。RS- 232串口通信最远距离是50英尺。
-DB-9针连接头
-------------
\ 1 2 3 4 5 /
-\ 6 7 8 9 /
-----------
从计算机连出的线的截面。
RS-232针脚的功能:
数据:
TXD(pin 3): 串口数据输出
RXD(pin 2): 串口数据输入
握手:
RTS(pin 7): 发送数据请求
CTS(pin 8): 清除发送
DSR(pin 6): 数据发送就绪
DCD(pin 1): 数据载波检测
DTR(pin 4): 数据终端就绪
地线:
GND(pin 5): 地线
其他
RI(pin 9): 铃声指示
注:
COM接口就是遵循RS232标准的物理口。
COM口指串口的物理实现,而RS232是一种串口接口标准。
COM接口
------------------------------------------
COM接口是指Component Object Mode接口,是微软定义的标准接口。
串口叫做串行接口,现在的PC机一般有两个串行口COM 1和COM 2。串行口不同于并行口之处在于它的数据和控制信息是一位接一位地传送出去的。虽然这样速度会慢一些,但传送距离较并行口更长,因此若要进行较长距离的通信时,应使用串行口。通常COM 1使用的是9针D形连接器,也称之为RS-232接口,而COM 2有的使用的是老式的DB25针连接器,也称之为RS-422接口,这种接口目前已经很少使用。
RS232 通信 (VB与C 通讯协议,C版)2007-10-13 10:29:08| 分类: C Language | 标签: |字号大中小 订阅 .
/*=============================================================================
PIC RS232收到'S'or's',返回"S:StartADC",开始测量CH0电压,并且将数据通过RS232送出;
收到'Q'or'q',返回"Q:EndADC",停止量测CH0电压.
============================================================================*/
///
// MPLAB IDE V7.11 + CCS C3.18
// Use 16F877A ADC and Rs232 for MCD2-demo
//
// by LW7807@163.com
// 2005/06/23
///
#include <16F877A.h> // PIC16F877 header file
#pragma device ADC=10 // 10 bits ADC
#pragma use delay(clock=4000000) // for 4Mhz crystal
#pragma fuses XT, NOWDT, NOPROTECT, NOLVP // for debug mode,//XT就是选时钟,NOWDT没有看门狗 ,NOPROTECT没保护,NOLVP没低电压编程
#pragma use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, stream=MYPC) //stream表示对RS232赋缺省值
// rs232 setting
#define DO_NOTHING 0
#define DO_START_ADC 1
#define DO_END_ADC 2
/*===========================================================================*/
void main(void)
{
int16 int_volt; //定义一个16位的整形变量,CCS C缺省是正数无符号,最大到2^16=65536.
int8 str_volt[21];//定义一个8位的数组变量,CCS C缺省是正数无符号,最大到2^8=256.
float flt_volt; //定义一个32位的浮点数变量
int8 do_what = DO_NOTHING;
int8 tmp;
while(1){
// if rs232 get char
if(0 != kbhit()) //Return true when a character is received in the buffer in case of hardware RS232.
//kbhit()即只要有键盘输入字符发送到RS232缓冲器,就返回TURE-1,否则返回False-0.
{
tmp = fgetc(MYPC);//fgetc()接收到RS232缓冲器的字符,并赋值给tmp.
switch(tmp)
{
case 'S':
case 's':
printf( "S:StartADC\n" );
do_what = DO_START_ADC;
// init pic16f877a adc
setup_adc_ports(RA0_RA1_RA3_ANALOG);
setup_adc(ADC_CLOCK_INTERNAL);
set_adc_channel(0);
break;
case 'Q':
case 'q':
printf( "Q:EndADC\n" );
do_what = DO_END_ADC;
// adc off
setup_adc(ADC_OFF);
break;
default : // rs232 get other char
putc(tmp);
break;
}//end switch(tmp)
}//end if(kbhit())
switch(do_what)
{
case DO_START_ADC:
// start adc and send result to PC
int_volt = read_adc();
flt_volt = 5.0 * int_volt / 0x3ff;
sprintf(str_volt, "ADC_CH0:%1.3fV\n", flt_volt);
printf(str_volt);
printf( "delay_ms(300)\n" );
delay_ms(300);
break;
case DO_END_ADC:
// you want to do
break;
case DO_NOTHING:
// you want to do
break;
default:
break;
}//end switch(do_what)
}//end while(1)
}//end main()
RS232通信协议源代码相关推荐
- 通信协议——Uart、RS232、RS485、SPI
RS485/RS232通信协议并不是单独协议,只是电气层的协议,依赖于串口. UART帧格式 1位起始位: 5-8位数据位(先发低位,后发高位): 校验位(可有可无): (1/1.5/2位)停止位; ...
- RS232通信之C++实现---PC端
通常设备与计算机连接的最简单的端口就是RS-232串行通信端口.由于实际操作简单,而且价格便宜,是工控方面实时控制通信中较常用的一种通信方式.因此串行通信端口RS232在系统控制范畴中占据着极其重要的 ...
- 各类通信协议归纳整理(偏硬件)
本文主要用于学习,资料及图片多来源于网络,若存在侵权请联系作者删除,若存在错误,请批评指正. 1 通信基本概念 通信一般有三个步骤:编码.传输和解码. 可分为同步通信和异步通信: 同步:需要时钟信号 ...
- UART/RS232传输协议
一.RS232通信协议是目前最常用的一种全双工点对点式的异步串行通信协议接口标准.RS232接口标准由于出现较早,所以其目前存在很多问题. (1).接口电平值较高,易损坏接口电路的芯片. (2).传输 ...
- linux系统运行application,[分享]分享曾经做过的一个嵌入式系统application框架 | 勤奋的小青蛙...
=================第一天================ 前言: 本文只是分享下自己曾经开发过的一个嵌入式Linux+Qt的系统应用层开发框架,只是分享出来,算不上什么高深的东西,希望 ...
- python网络编程案例—五子棋游戏
一.本案例基于UDP的socket编程方法来制作五子棋程序,网络五子棋采用C/S架构,分为服务器端和客户端,游戏时服务端首先启动,当客户端启动连接后,服务器端可以走棋,轮到自己棋才可以在棋盘上落子,同 ...
- 嵌入式STM32入门之STM32基础串口通信
STM32基础串口通信 一.前言 二.串口协议 (1)浅谈设备通信方式 (2)具体串口协议 (3)STM32的串口通信 (4)RS-232通信协议 (5)USB To TTL(CH340) 5.1 C ...
- xs128秒表c语言程序,HC-EZ-XS128实验指导书.doc
实验1 GPIO实验 实验1.1 流水灯 一.实验目的及涉及知识点 1.掌握GPIO口基本寄存器的使用,掌握如何将GPIO作为输出口.2.初步了解如何使用C语言编写飞思卡尔单片机程序. 二.实验内容: ...
- 【嵌入式】STM32串口通信
[嵌入式]STM32串口通信 一.串口通信协议 1.串口通信简介 2.串口通信原理 二.RS232通信协议 1.RS232协议简介 2.机械规约 3.电气规约 三.STM32的USART串口通信(查询 ...
最新文章
- SANS:2012年度日志管理调查报告
- 2.5 指数加权平均的偏差修正-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授
- div超出不换行_DIV元素不换行
- Python类的约束以及super()剖析
- 汇编语言的准备知识--给初次接触汇编者 (1-4) 转载
- maven 公用仓库_Maven系列(二):Maven 核心概念
- 计算机专业联考335分,联考专业分、文化分达到多少能过本科线(附2019年美术高考分数线汇总...
- 前端DEMO:网络上流行的抖音罗盘
- Gradle插件学习笔记(二)
- float php 运算_PHP面试经典题目
- 微型计算机期末总结卷首语,个人总结卷首语.doc
- Qt学习之路之启动浏览器
- 计算机视觉(三)线性分类器
- Android Base64编码解码
- unison与fswatch文件同步
- mybatis+mysql查询类别下的所有子类别(递归)
- 计算机视觉——Bag Of features图像检索
- 论文阅读(13) 水母游泳过程中的神经机械波共振(2021)
- android锁定屏幕通知_如何在Android锁定屏幕上隐藏敏感通知
- 系统总结深度学习的主要的损失函数和优化器