热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

RS232通信协议源代码

参考一下intOpenComm(char*commstr,char*boundstr){structtermiot;charfilename[20];intco

参考一下
    

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()

 

 


推荐阅读
  • C语言注释工具及快捷键,删除C语言注释工具的实现思路
    本文介绍了C语言中注释的两种方式以及注释的作用,提供了删除C语言注释的工具实现思路,并分享了C语言中注释的快捷键操作方法。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
  • Go语言实现堆排序的详细教程
    本文主要介绍了Go语言实现堆排序的详细教程,包括大根堆的定义和完全二叉树的概念。通过图解和算法描述,详细介绍了堆排序的实现过程。堆排序是一种效率很高的排序算法,时间复杂度为O(nlgn)。阅读本文大约需要15分钟。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 设计模式——模板方法模式的应用和优缺点
    本文介绍了设计模式中的模板方法模式,包括其定义、应用、优点、缺点和使用场景。模板方法模式是一种基于继承的代码复用技术,通过将复杂流程的实现步骤封装在基本方法中,并在抽象父类中定义模板方法的执行次序,子类可以覆盖某些步骤,实现相同的算法框架的不同功能。该模式在软件开发中具有广泛的应用价值。 ... [详细]
  • 本文比较了eBPF和WebAssembly作为云原生VM的特点和应用领域。eBPF作为运行在Linux内核中的轻量级代码执行沙箱,适用于网络或安全相关的任务;而WebAssembly作为图灵完备的语言,在商业应用中具有优势。同时,介绍了WebAssembly在Linux内核中运行的尝试以及基于LLVM的云原生WebAssembly编译器WasmEdge Runtime的案例,展示了WebAssembly作为原生应用程序的潜力。 ... [详细]
  • 阿里Treebased Deep Match(TDM) 学习笔记及技术发展回顾
    本文介绍了阿里Treebased Deep Match(TDM)的学习笔记,同时回顾了工业界技术发展的几代演进。从基于统计的启发式规则方法到基于内积模型的向量检索方法,再到引入复杂深度学习模型的下一代匹配技术。文章详细解释了基于统计的启发式规则方法和基于内积模型的向量检索方法的原理和应用,并介绍了TDM的背景和优势。最后,文章提到了向量距离和基于向量聚类的索引结构对于加速匹配效率的作用。本文对于理解TDM的学习过程和了解匹配技术的发展具有重要意义。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 本文介绍了Perl的测试框架Test::Base,它是一个数据驱动的测试框架,可以自动进行单元测试,省去手工编写测试程序的麻烦。与Test::More完全兼容,使用方法简单。以plural函数为例,展示了Test::Base的使用方法。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 热血合击脚本辅助工具及随机数生成器源码分享
    本文分享了一个热血合击脚本辅助工具及随机数生成器源码。游戏脚本能够实现类似真实玩家的操作,但信息量有限且操作不可控。热血合击脚本辅助工具可以帮助玩家自动刷图、换图拉怪等操作,并提供了雷电云手机的扩展服务。此外,还介绍了使用mt_rand函数作为随机数生成器的代码示例。 ... [详细]
author-avatar
killer
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有