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

 

 

  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值