串口通讯的串口类模块

串口通讯的串口类模块
串口通讯的串口类模块

本模块开发平台BCB,用于串口通讯的串口类模块,不需要使用系统或第三方带的串口Com 组件,不需要注册,直接加入到软件声明中即可使用。

Comm.h //头文件声明

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

#ifndef CommH

#define CommH

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

#include

#include

#include

#include

#include

#include

//类型定义

enum TBaudRate {br110=110, br300=300, br600=600, br1200=1200, br2400=2400,

br4800=4800, br9600=9600, br14400=14400, br19200=19200,

br38400=38400, br56000=56000, br57600=57600, br115200=115200};

enum TComPortNumber {pnCOM1, pnCOM2, pnCOM3, pnCOM4, pnCOM5, pnCOM6, pnCOM7, pnCOM8,

pnCOM9, pnCOM10, pnCOM11, pnCOM12, pnCOM13, pnCOM14, pnCOM15, pnCOM16};

enum TParity { None, Odd, Even, Mark, Space };

enum TStopBits { SB1, SB1_5, SB2 };

enum TDataBits { DB5, DB6, DB7, DB8 };

enum THwHandShaking{hhNone,hhNoneRTSON,hhRTSCTS};

enum TSwHandShaking{shNone,shXonXoff};

// 输入缓冲区的默认大小

const long INPUTBUFFERSIZE = 4096;

// Line Status位定义

const int ME_CTS = 1;

const int ME_DSR = 2;

const int ME_RING = 4;

const int ME_RLSD = 8;

//DCB 位定义

const long dcb_Binary = 0x00000001;

const long dcb_ParityCheck = 0x00000002;

const long dcb_OutxCtsFlow = 0x00000004;

const long dcb_OutxDsrFlow = 0x00000008;

const long dcb_DtrControlMask = 0x00000030;

const long dcb_DtrControlDisable = 0x00000000;

const long dcb_DtrControlEnable = 0x00000010;

const long dcb_DtrControlHandshake = 0x00000020;

const long dcb_DsrSensivity = 0x00000040;

const long dcb_TXContinueOnXoff = 0x00000080;

const long dcb_OutX = 0x00000100;

const long dcb_InX = 0x00000200;

const long dcb_ErrorChar = 0x00000400;

const long dcb_NullStrip = 0x00000800;

const long dcb_RtsControlMask = 0x00003000;

const long dcb_RtsControlDisable = 0x00000000;

const long dcb_RtsControlEnable = 0x00001000;

const long dcb_RtsControlHandShake = 0x00002000;

const long dcb_RtsControlToggle = 0x00003000;

const long dcb_AbortOnError = 0x00004000;

const long dcb_Reserveds = 0xFFFF8000;

//事件函数定位器声明

typedef void __fastcall (__closure *TReceiveDataEvent)(System::TObject *Sender);

typedef void __fastcall (__closure *TReceiveErrorEvent)(System::TObject *Sender,

DWORD EventMask);

typedef void __fastcall (__closure *TModemStateChangeEvent)(System::TObject *Sender,

DWORD ModemEvent);

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

class PACKAGE TComm : public TComponent

{

private:

TTimer *CommTimer; //组件用的定时器

char szInputBuffer[INPUTBUFFERSIZE];

HANDLE hComm;

TComPortNumber FCommPort;

bool FPortOpen;

TBaudRate FBaudRate;

bool FParityCheck;

THwHandShaking FHwHandShaking;

TSwHandShaking FSwHandShaking;

TDataBits FDataBits;

TParity FParity;

TStopBits FStopBits;

int FInputLen; //每次执行Input时所读取的字符串长度

int FRThreshold; //设置引发接收事件的门坎

bool FDTR;

bool FRTS;

String FInputData;

DynamicArray FInputByteData;

// FInputByteData: array of Byte;

int FCommEvent;

int FCommError;

bool FCDHolding;

bool FCTSHolding;

bool FDSRHolding;

bool FRIHolding;

//设置函数

void __fastcall SetCommPort(TComPortNumber Port); //设置COMPort

void __fastcall SetBaudRate(TBaudRate Rate); //设置速率

void __fastcall SetHwHandShaking(THwHandShaking c ); //硬件交握

void __fastcall SetSwHandShaking(TSwHandShaking c ); //软件交握

THwHandShaking __fastcall GetHwHandShaking(void); //硬件交握

TSwHandShaking __fastcall GetSwHandShaking(void); //软件交握

void __fastcall SetDataBits(TDataBits Size); //数据位数

void __fastcall SetParity(TParity p); //奇偶校验

void __fastcall SetStopBits(TStopBits Bits); //停止位

void __fastcall SetInDataCount(DWORD StrNo); //设成0表示清除FInputData

void __fastcall SetRThreshold(int RTNo); //接收门坎

void __fastcall SetPortOpen(bool b); //打开通信端口

void _SetCommState(void); //设置通信参数

bool __fastcall GetRTSStatus();

bool __fastcall GetDTRStatus();

void __fastcall SetDTRStatus(bool b); //DTR 状态

void __fastcall SetRTSStatus(bool b); //RTS状态

void __fastcall ReadProcess(void); //读取数据函数

void __fastcall EventProcess(void); //事件检测函数

void __fastcall GetModemState(void); //线路状态检测函数

void OpenComm(void); //打开通讯端口函数

void __fastcall CloseComm(void); //开关通信端口函数

int __fastcall ReadCommEvent(void); //硬件线路状态值读取

int __fastcall ReadCommError(void); //错误状态值的读取

String __fastcall ReadInputData(void); //返回收到的数据

int __fastcall ReadInDataCount(void); //读取有多少数据

bool __fastcall ReadCDHolding(void); //取得CD线路状态

bool __fastcall ReadDSRHolding(void); //取得DSR线路状态

bool __fastcall ReadRIHolding(void); //取得RI线路状态

bool __fastcall ReadCTSHolding(void); //取得CTS线路状态

//事件

TReceiveDataEvent FOnReceiveData;

TReceiveErrorEvent FOnReceiveError;

TModemStateChangeEvent FOnModemStateChange;

protected:

void __fastcall ProcTimer(TObject *Sender);

void __fastcall ReceiveData(void);

void __fastcall ReceiveError(DWORD EvtMask);

void __fastcall ModemStateChange(DWORD ModemEvent);

public:

__fastcall TComm(TComponent* Owner); //构造函数

bool OutputString(String DataToWrite);

bool OutputByte(const DynamicArray ByteData);

DynamicArray ReadInputByte(void);

__property bool PortOpen ={read = FPortOpen, write=SetPortOpen,default=false};

__property DWORD DataCount = { read = ReadInDataCount , write = SetInDataCount};

__property bool DTREnabled = { read = GetDTRStatus, write = SetDTRStatus};

__property bool RTSEnabled = { read = GetRTSStatus, write = SetRTSStatus};

__published:

//以下加入属性

__property TComPortNumber CommPort =

{read = FCommPort, write = SetCommPort, default = pnCOM1};

__property TBaudRate BaudRate = {read = FBaudRate, write = SetBaudRate, default = br9600};

__property THwHandShaking HwHandShaking =

{read = GetHwHandShaking, write = SetHwHandShaking, default = hhNone};

__property TSwHandShaking SwHandShaking =

{read = GetSwHandShaking, write = SetSwHandShaking, default = shNone};

__property TDataBits DataBits ={ read = FDataBits ,write =SetDataBits,default = DB8} ;

__property TParity Parity = { read = FParity ,write = SetParity,default = None};

__property TStopBits StopBits ={ read = FStopBits ,write = SetStopBits,default =SB1};

__property DWORD CommEvent = { read = ReadCommEvent};

__property DWORD CommError = {read = ReadCommError};

__property String Input = { read = ReadInputData};

__property int InputLen = { read = FInputLen , write = FInputLen, default =0};

__property int RThreshold = { read = FRThreshold ,write = SetRThreshold, default =0 };

__property bool CDHolding = { read = ReadCDHolding};

__property bool DSRHolding = { read = ReadDSRHolding};

__property bool RIHolding = { read = ReadRIHolding};

__property bool CTSHolding = { read = ReadCTSHolding};

//事件

__property TReceiveDataEvent OnReceiveData =

{read = FOnReceiveData , write = FOnReceiveData};

__property TReceiveErrorEvent OnReceiveError =

{read = FOnReceiveError , write = FOnReceiveError};

__property TModemStateChangeEvent OnModemStateChange =

{read = FOnModemStateChange , write = FOnModemStateChange};

};

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

#endif

Comm.cpp //主文件内容

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

#include

#pragma hdrstop

#include "Comm.h"

#pragma package(smart_init)

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

// ValidCtrCheck is used to assure that the components created do not have

// any pure virtual functions.

//

static inline void ValidCtrCheck(TComm *)

{

new TComm(NULL);

}

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

__fastcall TComm::TComm(TComponent* Owner) : TComponent(Owner)

{

CommTimer = new TTimer(this);

CommTimer->Enabled = false;

CommTimer->Interval = 5;

CommTimer->OnTimer = ProcTimer;

hComm = 0; //通信端口Handle先清空

FPortOpen = False;

FCommPort = pnCOM1; //默认COM1

FBaudRate = br9600; //9600bps

FHwHandShaking = hhNone; //不启动硬件流量控制

FSwHandShaking = shNone; //不启动软件流量控制

FDataBits = DB8; //数据位数=8

FParity = None; //不作同位检查

FStopBits = SB1; //停止位数=1

FInputLen = 0; //默认是一次指令全部读取

FDTR = FRTS = false;

}

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

namespace Comm

{

void __fastcall PACKAGE Register()

{

TComponentClass classes[1] = {__classid(TComm)};

RegisterComponents("System", classes, 0);

}

}

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

void TComm::OpenComm(void)

{

HANDLE hNewCommFile;

String ComStr;

char *COMNo;

ComStr = "COM" + IntToStr(1+FCommPort);

hNewCommFile = CreateFile( ComStr.c_str(),

GENERIC_READ | GENERIC_WRITE,

0, //not shared

NULL, //no security

OPEN_EXISTING,

0, //No Overlapped

NULL //template

);

if (hNewCommFile == INV ALID_HANDLE_V ALUE)

throw "打开串口错误!";

//ShowMessage("Error opening serial port");

//raise Exception.Create( "Error opening serial port" );

if (!SetupComm(hNewCommFile, INPUTBUFFERSIZE, INPUTBUFFERSIZE))

{

CloseHandle(hComm);

throw "不能设置串口缓冲区!";

//ShowMessage("Cannot setup comm buffer");

}

// It is ok to continue.

hComm = hNewCommFile;

// 清除湲冲区

PurgeComm( hComm, PURGE_TXABORT | PURGE_RXABORT |

PURGE_TXCLEAR | PURGE_RXCLEAR ) ;

// 通信端口配置

_SetCommState();

FDTR = true;

SetDTRStatus(FDTR);

SetRTSStatus(FRTS);

FPortOpen = True;

CommTimer->Enabled = true;

}

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

void TComm::_SetCommState(void)

{

DCB dcb;

DWORD tmpValue;

//取得串行端口设置

GetCommState(hComm, &dcb);

//更改传输速率

dcb.BaudRate = FBaudRate;

dcb.fBinary = 1; //必须指定为1

dcb.Parity = (unsigned char)FParity; //Parity的指定

FParityCheck = false;

if (FParity != 0)

FParityCheck = true;

if (FParityCheck)

dcb.fParity = (unsigned long)dcb_ParityCheck; // Enable parity check

// 设置硬件流量控制

switch (FHwHandShaking)

{

case hhNone:

dcb.fRtsControl=0;

break;

case hhNoneRTSON:

dcb.fRtsControl = RTS_CONTROL_ENABLE; //dcb_RtsControlEnable;

break;

case hhRTSCTS:

dcb.fRtsControl = RTS_CONTROL_HANDSHAKE; //dcb_RtsControlHandShake;

dcb.fOutxCtsFlow = 1; //dcb_OutxCtsFlow;

break;

}

//设置软件流量控制

if (FSwHandShaking!=shNone)

{

dcb.fOutX = 1; //dcb_OutX;

dcb.fInX = 1; //dcb_InX;

//设置数据位数

dcb.ByteSize = FDataBits + 5;

//设置停止位数

dcb.StopBits = FStopBits ;

//将设置写入

SetCommState(hComm, &dcb);

}

//---------- 组件用的定时器事件-----------------//

void __fastcall TComm::ProcTimer(TObject *Sender)

{

DWORD tmpValue;

DWORD dwCommError;

COMSTAT CS;

if (hComm == 0) return;

//若设置读取的字符数,检查并引发事件

ClearCommError(hComm,&dwCommError,&CS); //取得状态

FCommError = dwCommError; //错误数值

if (FRThreshold > 0)

if (CS.cbInQue >= (DWORD)FRThreshold) ReceiveData();

GetModemState();

// EventProcess();

Application->ProcessMessages(); //看有无其他的指令需执行,以免锁住//检查线路状态是否发生改变,若改变则引发事件

tmpValue = FCommEvent;

if (tmpValue != 0) ModemStateChange(tmpValue);

Application->ProcessMessages(); //看有无其他的指令需执行,以免锁住//若发生错误,则引发错误

tmpValue = FCommError;

if (tmpValue != 0) ReceiveError(tmpValue);

Application->ProcessMessages(); //看有无其他的指令需执行,以免锁住}

//------------------- 线路状态检测函数----------------//

void __fastcall TComm::GetModemState(void)

{

DWORD dwModemState;

if (hComm==0)

ShowMessage("串口打开错误!");

if (GetCommModemStatus(hComm, &dwModemState ))

{

if (dwModemState & MS_RLSD_ON)

if (!FCDHolding) FCommEvent=FCommEvent+EV_RLSD;

FCDHolding=true;

}

else

{

if (FCDHolding) FCommEvent=FCommEvent-EV_RLSD;

FCDHolding=false;

}

if (dwModemState & MS_DSR_ON)

{

if (!FDSRHolding) FCommEvent=FCommEvent+EV_DSR;

FDSRHolding=true;

}

else

{

if (FDSRHolding) FCommEvent=FCommEvent-EV_DSR;

FDSRHolding=false;

}

if (dwModemState & MS_RING_ON)

{

if (!FRIHolding) FCommEvent=FCommEvent+EV_RING;

FRIHolding=true;

}

else

{

if (FRIHolding) FCommEvent=FCommEvent-EV_RING;

FRIHolding=false;

}

if (dwModemState & MS_CTS_ON)

{

if (!FCTSHolding) FCommEvent=FCommEvent+EV_CTS;

FCTSHolding=true;

}

else

{

if (FCTSHolding) FCommEvent=FCommEvent-EV_CTS;

FCTSHolding=false;

}

} // GetCommModem Loop

}

//---------------- Receive Data ---------------------//

void __fastcall TComm::ReceiveData(void)

if (FOnReceiveData) FOnReceiveData(this);

}

//----------------- Modem State Change ------------//

void __fastcall TComm::ModemStateChange(DWORD ModemEvent)

{

if (FOnModemStateChange) FOnModemStateChange( this, ModemEvent ); }

//---------------- Receive Error ---------------//

void __fastcall TComm::ReceiveError(DWORD EvtMask)

{

if (FOnReceiveError) FOnReceiveError( this, EvtMask );

}

//----------------- Change Port --------------//

void __fastcall TComm::SetCommPort(TComPortNumber Port)

{

if (Port==FCommPort) return;

FCommPort = Port;

}

//---------------- 设置速率----------------//

void __fastcall TComm::SetBaudRate(TBaudRate Rate)

{

if (Rate == FBaudRate) return;

FBaudRate = Rate;

if (hComm != 0) _SetCommState();

}

//---------------- 硬件交握----------------//

THwHandShaking __fastcall TComm::GetHwHandShaking(void)

{

return(FHwHandShaking);

}

void __fastcall TComm::SetHwHandShaking(THwHandShaking c )

{

if (c == FHwHandShaking) return;

FHwHandShaking = c;

if (hComm != 0) _SetCommState();

}

//---------------- 软件交握----------------//

TSwHandShaking __fastcall TComm::GetSwHandShaking(void)

return(FSwHandShaking);

}

void __fastcall TComm::SetSwHandShaking(TSwHandShaking c ) {

if (c == FSwHandShaking) return;

FSwHandShaking = c;

if (hComm != 0) _SetCommState();

}

//---------------- 数据位数----------------//

void __fastcall TComm::SetDataBits(TDataBits Size )

{

if (Size == FDataBits) return;

FDataBits = Size;

if (hComm != 0) _SetCommState();

}

//---------------- 奇偶校验----------------//

void __fastcall TComm::SetParity(TParity p )

{

if (p == FParity) return;

FParity = p;

if (hComm != 0) _SetCommState();

}

//---------------- 停止位----------------//

void __fastcall TComm::SetStopBits(TStopBits Bits )

{

if (Bits == FStopBits) return;

FStopBits = Bits;

if (hComm != 0) _SetCommState();

}

//---------------- 用来清除Buffer ----------------//

void __fastcall TComm::SetInDataCount(DWORD StrNo)

{

if (StrNo!=0) return;

PurgeComm(hComm, PURGE_RXCLEAR); // 清除COM 资料}

//---------------- 接收阈值----------------//

void __fastcall TComm::SetRThreshold(int RTNo)

{

FRThreshold=RTNo;

}

//---------------- 开始通信端口----------------//

void __fastcall TComm::SetPortOpen(bool b)

CommTimer->Enabled=false;

if (b) //若指定打开通信端口,则……

{

if (FPortOpen)

{

ShowMessage("串口已经打开!");

return;

} //FportOpen loop

OpenComm(); //打开通信端口

return;

} //b loop

CloseComm();

}

//---------------- DTR状态----------------//

bool __fastcall TComm::GetDTRStatus()

{

return(FDTR);

}

void __fastcall TComm::SetDTRStatus(bool b)

{

FDTR=b;

if (hComm==0) return;

if (b)

EscapeCommFunction(hComm,SETDTR); //将DTR升至高电位else

EscapeCommFunction(hComm,CLRDTR);//将DTR降至低电位}

//---------------- RTS状态----------------//

bool __fastcall TComm::GetRTSStatus()

{

return(FRTS);

}

void __fastcall TComm::SetRTSStatus(bool b)

{

FRTS=b;

if (hComm==0) return;

if (b)

EscapeCommFunction(hComm,SETRTS); //将RTS升至高电位else

EscapeCommFunction(hComm,CLRRTS); //将RTS降至低电位}

//---------------- 读取数据函数----------------//

void __fastcall TComm::ReadProcess(void)

{

DWORD nBytesRead,dwCommError,i,ReadLen;

COMSTAT CS;

//使用ClearCommError得知有多少的数据在缓冲区中

//亦一并得知错误种类

ClearCommError(hComm,&dwCommError,&CS); // 取得状态

FCommError=dwCommError; //错误数值

if (CS.cbInQue !=0) //若缓冲区有数据,则读取

{

if (InputLen==0) //指定读取的数据数

ReadLen=CS.cbInQue;

else

ReadLen=InputLen;

if (CS.cbInQue > sizeof(szInputBuffer))

PurgeComm(hComm, PURGE_RXCLEAR); // 清除COM 资料

else

{

//读取数据

if (ReadFile(hComm, szInputBuffer,ReadLen,&nBytesRead,NULL)) // 接收COM 的数据

{

//取出数据

//FInputData=copy(szInputBuffer,1,ReadLen);

FInputData=AnsiString(szInputBuffer,(unsigned int)ReadLen);

//设置字节动态数组的长度

FInputByteData.Length =ReadLen;

//SetLength(FInputByteData,ReadLen);

//将数据搬到数组中

for (i=0 ;i

FInputByteData[i]=szInputBuffer[i];

} //ReadFile Loop

}//else Loop

} //cs.binQue Loop

}

//---------------- 事件检测----------------//

void __fastcall TComm::EventProcess(void)

{

}

//---------------- 关闭通信端口函数----------------//

void __fastcall TComm::CloseComm(void)

{

if (hComm == 0) return;

// 实际关闭通信端口

CloseHandle( hComm );

FPortOpen = false;

hComm = 0;

}

//---------------- 硬件线路状态值读取----------------//

int __fastcall TComm::ReadCommEvent(void)

{

return(FCommEvent);

}

//---------------- 错误状态值的读取----------------//

int __fastcall TComm::ReadCommError(void)

{

return(FCommError);

}

//---------------- 返回收到的数据----------------//

String __fastcall TComm::ReadInputData(void)

{

if (hComm==0)

ShowMessage("串口打开错误!");

//决定每一次的指令要返回多少的字符(以Byte为单位) ReadProcess();

return(FInputData);

}

//---------------- 读取已收到的数据数量----------------//

int __fastcall TComm::ReadInDataCount(void)

{

COMSTAT CS;

DWORD dwCommError;

ClearCommError(hComm,&dwCommError,&CS); //取得状态return(CS.cbInQue);

}

//---------------- 取得CD线路状态----------------//

bool __fastcall TComm::ReadCDHolding(void)

{

return(FCDHolding);

}

//---------------- 取得DSR线路状态----------------//

bool __fastcall TComm::ReadDSRHolding(void)

{

return(FDSRHolding);

}

//---------------- 取得RI线路状态----------------//

bool __fastcall TComm::ReadRIHolding(void)

{

return(FRIHolding);

}

//---------------- 取得CTS线路状态----------------//

bool __fastcall TComm::ReadCTSHolding(void)

{

return(FCTSHolding);

}

//--------------- 字符串指令输出-----------------//

bool TComm::OutputString(String DataToWrite)

{

DWORD lrc;

Char *tmpChar;

if (hComm==0)

{

ShowMessage("串口打开错误!");

return(false);

}

// 送出数据

tmpChar=DataToWrite.c_str();

if (WriteFile(hComm,tmpChar,DataToWrite.Length(), &lrc, NULL)) return(true);

return(false);

}

//--------------- 字符串字节输出---------------//

bool TComm::OutputByte(const DynamicArray ByteData) {

DWORD lrc,SendNum;

int i;

byte ch;

if (hComm==0)

{

ShowMessage("串口打开错误!");

return(false);

}

// 送出数据

for (i=ByteData.Low;i<=ByteData.High ;i++)

{

ch = ByteData[i];

WriteFile(hComm,&ch,1,&lrc,NULL);

}

return(true);

}

//--------------- 输入字节读取--------------// DynamicArray TComm::ReadInputByte(void) {

int i;

if (hComm==0)

ShowMessage("串口打开错误!"); ReadProcess();//执行读取函数

return(FInputByteData);//取得数据数组的最高索引值}

RS232串口通信详解

RS232串口通信详解(引脚定义,电气特性,传输格式,接收过程,单片机晶振,RS485,RS422) 通信原理知识2010-01-03 20:53 阅读1 评论0 字号:大中小RS232串口通信详解(引脚定义,电气特性,传输格式,接收过程,单片机晶振,RS485,RS422) 串口是计算机上一种非常通用的设备通信协议。 --------------------------------- 串口的引脚定义: 信号方向来 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位。由于数是在传输线上定时的,并且每一

基于单片机的串口通信模块设计

1 绪论 1.1 研究背景 通信是指不同的独立系统利用线路互相交换数据,它的主要目的是将数据从一端传送到另一端,实现数据的交换。在现代工业控制中,通常采用计算机作为上位机与下层的实时控制与监测设备进行通讯。现场数据必须通过一个数据收集器传给上位机,同样上位机向现场设备发命令也必须通过数据收集器。串行通信因其结构简单、执行速度快、抗干扰能力强等优点,已被广泛应用于数据采集和过程控制等领域。 计算机与外界的信息交换称为通信。基本的通信方式有并行通信和串行通信两种。串行通信是指一条信息额各位数据被逐位按顺序传送的通信方式。串行通信的特点是:数据位传送,按位顺序进行,最少只需要一根传输线即可完成,成本低但传送速度快,串行通信的距离可以从几米到几千米。 随着计算机技术尤其是单片微型机技术的发展,人们已越来越多地采用单片机来对一些工业控制系统中如温度、流量和压力等参数进行监测和控制。PC机具有强大的监控和管理能力,而单片机则具有快速及灵和的控制特点,通过PC 机的RS-232串行接口与外部设备进行通信,是许多测控系统中常用的一种通信解决方案。而随着USB接口技术的成熟和使用的普及,由于USB 接口有着 RS-232(DB-9)串口无法比拟的优点,RS-232(DB-9)串口正在逐步地为USB 接口所替代。而在现在的大多数笔记本电脑中,出于节省物理空间和用处不大等原因,RS-232(DB-9)串口已不再设置,这就约束了基于RS-232(DB-9)串口与PC 机联络的单片机设备的使用围。当前USB接口逐步取代RS-232(DB-9)串口已是大势所趋,单片机同计算机的USB通信在实际工作中的应用围也将越来越广。本文所介

串口通信的接线方法

目前较为常用的串口有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

串口通讯模块的信息与使用

串口通讯模块的信息与使用 朱震忠 SIEMENS A&D CS 2004-3-25 首先我们建议您访问siemens A&D公司的技术支持网站: www4.ad.siemens.de 在检索窗口中键入相关产品或问题的关键字,获取关于产品或问题的详细信息和手册。 图1 串口通讯模块基本信息介绍 CP340/CP341/CP440/CP441-1/CP441-2模块是西门子S7-300/400系列PLC中的串行通讯模块,这些模块具有1个(CP441-2有2个)串行通讯口(RS232C或TTY或RS485/422)。您可

以使用这种通讯模块实现S7300/400与其他串行通讯设备的数据交换,例如打印机、扫描仪、仪 表、Modbus主从站、Data Highway站、变频器,USS站等; 如下给出串口通讯模块以及相关产品的订货信息: 订货号产品名称支持的协议注释 S7-300系列 6ES7 340-1AH00-0AE0 S7300 RS232C 串行通讯模板ASCII, 3964R,USS 9针D型针接头6ES7 340-1AH01-0AE0 S7300 RS232C 串行通讯模板ASCII, 3964R, printer,USS 9针D型针接头6ES7 340-1BH00-0AE0 S7300 20mA TTY串行通讯模板ASCII, 3964R, printer,USS 9针D型针接头6ES7 340-1CH00-0AE0 S7300 RS422/485串行通讯模板ASCII, 3964R, printer,USS 9针D型针接头6ES7 341-1AH0x-0AE0 S7300 RS232C 串行通讯模板RK512, ASCII, 3964(R), Modbus Master/Slave(RTU格式), Data Highway(DF1协议) ,USS 9针D型针接头 6ES7 341-1BH0x-0AE0 S7300 20mA TTY串行通讯模板RK512, ASCII, 3964(R), Modbus Master/Slave(RTU格式), Data Highway(DF1协议) ,USS 9针D型孔接头 6ES7 341-1CH0x-0AE0 S7300 RS422/485串行通讯模板ASCII, Modbus Master/Slave(RTU格 式), Data Highway(DF1协议) ,USS 15针D型孔接头S7-400系列 6ES7 440-1CS00-0YE0 S7400 RS422/485串行通讯模板ASCII,3964(R),USS 9针D型孔接头 6ES7 441-1AA03-0AE0 + 6ES7 963-1AA00-0AA0 6ES7 963-2AA00-0AA0 6ES7 963-3AA00-0AA0 S7400串行通讯模板 RS232C 接口块 20mA TTY 接口块 RS422/485接口块 ASCII, 3964R, printer,USS 441-1加1个963模块才能组 成有一个接口的串行通讯模块 9针D型孔接头 9针D型针接头 15针D型针接头 6ES7 441-2AA03-0AE0 + 6ES7 963-1AA00-0AA0 6ES7 963-2AA00-0AA0 6ES7 963-3AA00-0AA0S7400串行通讯模板 RS232C 接口块 20mA TTY 接口块 RS422/485接口块 ASCII, Modbus Master/Slave(RTU格 式), Data Highway(DF1协议) ,USS 441-2加2个963模块可以组 成有两个接口的串行通讯模块 9针D型孔接头 9针D型针接头 15针D型针接头 连接电缆系列 6ES7 902-1AB00-0AA0 6ES7 902-1AC00-0AA0 6ES7 902-1AD00-0AA0 RS232C与RS232C连接电缆 5米 10米 15米 双头为9针D型孔接头 6ES7 902-2AB00-0AA0 6ES7 902-2AC00-0AA0 6ES7 902-2AG00-0AA0 20mA TTY与TTY连接电缆 5米 10米 50米 双头为9针D型针接头 6ES7 902-3AB00-0AA0 6ES7 902-3AC00-0AA0 6ES7 902-3AG00-0AA0 RS422与RS422连接电缆 5米 10米 50米 双头为15针D型针接头 协议驱动系列 6ES7 870-1AA01-0YA0 MODBUS主站硬件狗Dongle 包括软件、手册光盘 6ES7 870-1AA01-0YA1 MODBUS主站硬件狗Dongle Copy License,不包括软件、

C#串口通讯编程

C#中串口通信编程收藏 本文将介绍如何在.NET平台下使用C#创建串口通信程序,.NET 2.0提供了串口通信的功能,其命名 空间是System.IO.Ports。这个新的框架不但可以访问计算机上的串口,还可以和串口设备进行通信。 我们将使用标准的RS 232 C 在PC间通信。它工作在全双工模式下,而且我们不打算使用任何的握手 或流控制器,而是使用无modem连接。 命名空间 System.IO.Ports命名空间中最重用的是SerialPort 类。 创建SerialPort 对象 通过创建SerialPort 对象,我们可以在程序中控制串口通信的全过程。 我们将要用到的SerialPort 类的方法: ReadLine():从输入缓冲区读一新行的值,如果没有,会返回NULL WriteLine(string):写入输出缓冲 Open():打开一个新的串口连接 Close():关闭 Code: //create a Serial Port object SerialPort sp = new SerialPort (); 默认情况下,DataBits 值是8,StopBits 是1,通信端口是COM1。这些都可以在下面的属性中重新设置 : BaudRate:串口的波特率 StopBits:每个字节的停止位数量 ReadTimeout:当读操作没有完成时的停止时间。单位,毫秒 还有不少其它公共属性,自己查阅MSDN。 串口的硬件知识

在数据传输的时候,每个字节的数据通过单个的电缆线传输。包包括开始位,数据,结束为。一旦 开始位传出,后面就会传数据,可能是5,6,7或8位,就看你的设定了。发送和接收必须设定同样 的波特率和数据位数。 无猫模式 没有Modem模式的电缆只是简单地交叉传送和接收线。同样DTR & DSR, 和RTS & CTS 也需要交叉。 RS232针图 这里,我们三条线。互连2和3(一段的2pin连接3pin),连接两端的5pin。 [示例程序] 主程序 如果想使用默认属性,按“Save Status”按钮,如果想改变属性按“Property”。它会弹出下图:

串口通讯通信协议技术

串口通讯—通信协议 所谓通信协议是指通信双方的一种约定。约定包括对数据格式、同步方式、传送速度、传送步骤、检纠错方式以及控制字符定义等问题做出统一规定,通信双方必须共同遵守。因此,也叫做通信控制规程,或称传输控制规程,它属于ISO'S OSI七层参考模型中的数据链路层。 目前,采用的通信协议有两类:异步协议和同步协议。同步协议又有面向字符和面向比特以及面向字节计数三种。其中,面向字节计数的同步协议主要用于DEC公司的网络体系结构中。 一、物理接口标准 1.串行通信接口的基本任务 (1)实现数据格式化:因为来自CPU的是普通的并行数据,所以,接口电路应具有实现不同串行通信方式下的数据格式化的任务。在异步通信方式下,接口自动生成起止式的帧数据格式。在面向字符的同步方式下,接口要在待传送的数据块前加上同步字符。 (2)进行串-并转换:串行传送,数据是一位一位串行传送的,而计算机处理数据是并行数据。所以当数据由计算机送至数据发送器时,首先把串行数据转换为并行数才能送入计算机处理。因此串并转换是串行接口电路的重要任务。 (3)控制数据传输速率:串行通信接口电路应具有对数据传输速率——波特率进行选择和控制的能力。 (4)进行错误检测:在发送时接口电路对传送的字符数据自动生成奇偶校验位或其他校验码。在接收时,接口电路检查字符的奇偶校验或其他校验码,确定是否发生传送错误。 (5)进行TTL与EIA电平转换:CPU和终端均采用TTL电平及正逻辑,它们与EIA采用的电平及负逻辑不兼容,需在接口电路中进行转换。 (6)提供EIA-RS-232C接口标准所要求的信号线:远距离通信采用MODEM时,需要9根信号线;近距离零MODEM方式,只需要3根信号线。这些信号线由接口电路提供,以便与MODEM或终端进行联络与控制。 2、串行通信接口电路的组成 为了完成上述串行接口的任务,串行通信接口电路一般由可编程的串行接口芯片、波特率发生器、EIA 与TTL电平转换器以及地址译码电路组成。其中,串行接口芯片,随着大规模继承电路技术的发展,通用的同步(USRT)和异步(UART)接口芯片种类越来越多,如下表所示。它们的基本功能是类似的,都能实现

通用串口通讯程序设计

通用串口通讯程序设计 作者:和光同尘版本:V1.0 序 做硬件开发近20载,花了近十年做基础开发,对硬件开发略知一二,接触的做国防/工业大项目的人才我就是和他们沟通中获取了很多思想;人生已过而立之年,不惑解疑,总想写点什么。从一线研发(做了4年),开发(3年),硬件开发主管(12年),算起来人生从不到弱冠之年(中专毕业)开始接触MCS51、AVR等8位处理器到ARM v7核、CoretxM 核的32位处理器,CPLD/FPGA、PLC…………啰嗦了!! 最近因为工作原因需要把一些自己感悟的记录下来,希望传递给入门的有心沉下心做基础健壮扎实的初学者。

正文 做嵌入式硬件开发一般都会用到通讯数据交互,这就涉及通讯协议/规约的设计。本文从基础的串口(RS232、RS485等)为模型进行讲解。 说道串口通讯,就是编写串口程序,简单的就是1个字节的发送,1个字节的接收,但这不能满足绝大多数实际工作业务需求,实际需要一串字节数据的交互,A发送,B接收……Z 接收;Z机……B机收到根据情况需要回复(ACK)A机,这个过程就叫交互双向通讯(本文不讨论多主机、1主机相对复杂通讯机制。)。这种通讯就需要提前设计好通讯的规约(大家约定好暗号——每个字节代表什么意思)。 接下来编写通信程序(发送/接收),如何写出一个健壮高效串口程序?是否健壮高效其实很大一部分取决于通讯接收程序的架构。 通讯程序编写依据是——通讯规约,通讯帧的设计。 ●I类通用型: ||帧头段|===|数据段|===|校验码|===|帧尾段|| ●II类时隙通讯: ||开始时隙T(T1T2T3T4T5T6)|=|功能码|=|数据段|=|校验码|=|结束时隙T(T1T2T3)|注意:时隙只是纯粹的前后两帧数据的间隔时间,这期间坚决不能有数据产生。 1.1I类通用型 ◆帧头段 帧头段用于鉴别一串字节流中1帧数据起始位置,这个帧头段必须具有足够的特殊标识(易分辨)。 什么样的特殊标识可作为帧头? 根据个人经验: ①具有监测通讯波特率功能特点:0B01010101(55H)、0B10101010(AAH)或0B00000000(00H)、0B11111111(FFH); ②利用ASCII码如MODBUS ASCII规约以冒号‘:’(3AH)作为帧头。也可以采用ASCII ‘U’(55H)、‘@’(40H)等等 只要保证帧头字节数据内容,在所有通讯数据字节流中,除帧头有意为之而出现,那就是帧头。建议最好有两个字节及以上,这样数据出现与帧头一致的概率更加小,才做到独一无二的特殊性。

串口通信的基本知识

串口通信的基本知识 串口通信的基本概念 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。波特率可以远远大于这些值,但是波特率和距离成反比。高波特率常常用于放置的很近的仪器间的通信,典型的例子就是GPIB 设备的通信。 b,数据位:这是衡量通信中实际数据位的参数。当计算机发送一个信息包,实际的数据不会是8位的,标准的值是5、7和8位。如何设置取决于你想传送的信息。比如,标准的ASCII 码是0~127(7位)。扩展的ASCII码是0~255(8位)。如果数据使用简单的文本(标准ASCII码),那么每个数据包使用7位数据。每个包是指一个字节,包括开始/停止位,数据位和奇偶校验位。由于实际数据位取决于通信协议的选取,术语“包”指任何通信的情况。c,停止位:用于表示单个包的最后一位。典型的值为1,1.5和2位。由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。 d,奇偶校验位:在串口通信中一种简单的检错方式。有四种检错方式:偶、奇、高和低。当然没有校验位也是可以的。对于偶和奇校验的情况,串口会设置校验位(数据位后面的一位),用一个值确保传输的数据有偶个或者奇个逻辑高位。例如,如果数据是011,那么对

51单片机串口通信的原理与应用流程解析

51单片机串口通信的原理与应用流程解析 一、原理简介 51 单片机内部有一个全双工串行接口。什么叫全双工串口呢?一般来说,只能接受或只能发送的称为单工串行;既可接收又可发送,但不能同时进行的称为半双工;能同时接收和发送的串行口称为全双工串行口。串行通信是指数据一位一位地按顺序传送的通信方式,其突出优点是只需一根传输线,可大大降低硬件成本,适合远距离通信。其缺点是传输速度较低。 与之前一样,首先我们来了解单片机串口相关的寄存器。 SBUF 寄存器:它是两个在物理上独立的接收、发送缓冲器,可同时发送、接收数据,可通过指令对SBUF 的读写来区别是对接收缓冲器的操作还是对发送缓冲器的操作。从而控制外部两条独立的收发信号线RXD(P3.0)、TXD(P3.1),同时发送、接收数据,实现全双工。 串行口控制寄存器SCON(见表1)。 表1 SCON寄存器 表中各位(从左至右为从高位到低位)含义如下。 SM0 和SM1 :串行口工作方式控制位,其定义如表2 所示。 表2 串行口工作方式控制位 其中,fOSC 为单片机的时钟频率;波特率指串行口每秒钟发送(或接收)的位数。 SM2 :多机通信控制位。该仅用于方式2 和方式3 的多机通信。其中发送机SM2 = 1(需要程序控制设置)。接收机的串行口工作于方式2 或3,SM2=1 时,只有当接收到第9 位数据(RB8)为1 时,才把接收到的前8 位数据送入SBUF,且置位RI 发出中断申请引发串行接收中断,否则会将接受到的数据放弃。当SM2=0 时,就不管第位数据是0 还是1,都将数据送入SBUF,并置位RI 发出中断申请。工作于方式0 时,SM2 必须为0。

Java串口通信编程指南

Java串口通信编程指南

1. 概述 在java中,利用Java Communication包可以操作串口,但官方的包在3.0之后就只支持Linux和Solaris平台了,Windows平台的只支持到98年出的2.0版本,不过在XP下还能使用。另外,也可以用开源的Rxtx实现串口通信,这里仅以Java Communication包,在Windows 平台实现串口通信进行说明。 2. 前期准备 2.1. 下载Java Communication包 ?下载地址如下:https://www.360docs.net/doc/e67016168.html,/Jolt/javacomm20-win32.zip。 ?如果是非Windows平台,请到Sun网站选择其他版本下载。地址如下: https://www.360docs.net/doc/e67016168.html,/download/products.xml?id=43208d3d 2.2. 配置 ?解压缩javacomm20-win32.zip ?把win32com.dll拷贝到{JAVA_HOME}\jre\bin ?把comm.jar拷贝到{JAVA_HOME}\jre\lib\ext ?把https://www.360docs.net/doc/e67016168.html,m.properties拷贝到{JAVA_HOME}\jre\lib ?set CLASSPATH={JAVA_HOME}\jre \lib\ext \comm.jar;%classpath%

3. 实现过程 主要步骤包括: ?获得串口标识 ?打开串口 ?设置串行端口通讯参数 ?获取输入(出)流 ?进行读写操作 3.1. 获得串口标识 指定串口的端口号,生成串口的标识类的实例。 https://www.360docs.net/doc/e67016168.html,mPortIdentifier是通讯端口管理器,控制访问到通讯端口的中心类。一个应用程序首先使用CommPortIdentifier中的方法,通过相关的驱动去获取那些通讯端口是可用的并且选择一个端口便于开始。它包括如下功能: a. 通过驱动决定通讯端口是可用的。 b. 打开通讯端口为了I/O操作。 c. 决定端口的拥有者。 d. 解析端口拥有者的争夺。 e. 管理事件显示在端口拥有者的中的状态改变。 示例代码如下: 代码: 3.2. 打开串口 示例代码如下: 代码:

串行通讯原理说明--RS232_UART

串行通讯原理说明--RS232,UART电平等介绍 串行通讯:一条信息的各位数据被逐位按顺序传送的通讯方式称为串行通讯。 串行通讯的特点是:数据位传送,传按位顺序进行,最少只需一根传输线即可完成,成本低但送速度慢。串行通讯的距离可以从几米到几千米。 根据信息的传送方向,串行通讯可以进一步分为单工、半双工和全双工三种。 能够完成上述“串<- ->并”转换功能的电路,通常称为“通用异步收发器” (UART:Universal Asynchronous Receiver and Transmitter), 典型的芯片有:Intel 8250/8251,16550。 EIA-RS-232C对电器特性、逻辑电平和各种信号线功能都作了规定。 在TxD和RxD上:逻辑1(MARK) =-3V~-15V 逻辑0(SPACE)=+3~+15V 在RTS、CTS、DSR、DTR和DCD等控制线上: 信号有效(接通,ON状态,正电压)=+3V~+15V 信号无效(断开,OFF状态,负电压) = -3V~-15V 数据传输时,低位在前,高位在后 数据位:1位、2位 停止位:1位、1.5位、2位 .流控制在串行通讯中的作用 解决丢失数据的问题 .硬件流控制 硬件流控制常用的有RTS/CTS(请求发送/清除发送)流控制和DTR/DSR(数据终端就绪/ 数据设置就绪)流控制 .软件流控制 一般通过XON/XOFF来实现软件流控制。 奇校验:所有传送的数位(含字符的各数位和校验位)中,“1”的个数为奇数,如: 1 0110,0101 0 0110,0001 偶校验:所有传送的数位(含字符的各数位和校验位)中,“1”的个数为偶数,如: 1 0100,0101

串口通信模块的信息与使用

串口通信模块的信息与使用 1. 串行通讯模块基本信息介绍 CP340/CP341/CP440/CP441-1/CP441-2模块是西门子S7-300/400系列PLC中的串行通讯模块,这些模块具有1个或2个(CP441-2)串行通讯接口(RS232C、20mA-TTY或RS485/422)。您可以使用这些通讯模块实现S7-300/400系统与其他串行通讯设备的数据交换,例如打印机、扫描仪、智能仪表、第三方MODBUS主从站、Data Highway、变频器,USS站等。 1.1 产品订货信息 下表给出了常用串行通讯模块以及相关产品的订货信息:

表1 串口通讯模块以及相关产品的订货信息 说明:1、当您要实现MODBUS或Data Highway通讯时,需要在CP341/CP441-2模块上插入相应协议的硬件狗,这里我们所提到的硬件狗、Dongle、协议驱动或Loadable driver指的是同一个东西,如下图: 图1 2、MODBUS 是单主站结构的串行通信协议,系统中只能够有一个MODBUS主站,并且只能够实现主站和从站的数据交换,从站之间不能进行数据交换。 3、一般来讲,RS232C接口的通讯最大距离为15m,20mA-TTY接口的通讯最大距离为100m(主动模式)/ 1000m(被动模式),RS422/485接口的通讯最大距离位1200m。

4、Serial CPs模块可以同时与多台串行通讯设备进行通讯,如同时连接多个变频器、多个智能仪表等,如果您采用ASCII 通讯方式,需要人为地定义数据帧格式,可以在发送的数据包中包括站号、数据区、读写指令等信息,供Serial CPs 模块所连接的从站设备鉴别数据包是发给哪个站的,以及该数据包是对那个数据区进行的读或写。 5、串行通讯模板只有RS232C、20mA-TTY或RS485/422 三种电气接口类型,如果您想实现串口的光纤通讯,只能在电子市场上购买第三方制造的电气与光缆的转换设备,西门子不提供该类设备。 1.2 常用文档的下载链接 您可通过以下步骤获取您所需的文档: -请登陆网站:https://www.360docs.net/doc/e67016168.html,/Service/ -在页面左侧列表中点击链接:产品支持 -在新窗口右上角的搜索栏中输入“<关键字>”,并搜索 -搜索结束后在窗口右侧列表中点击“只搜索手册/操作指南、只搜索证书、只搜索证 书、只搜索FAQ常问问题只搜索更新信息” -最后列表中名为“<文档名称>”的条目即为您所需的文档。 常用文档的下载链接如下,您可以直接登陆如下网址下载相关资料: S7-200可编程控制器系统手册:1109582 SIMATIC S7-300 CPU 31xC 和CPU 31x:技术规格:12996906 CP340 使用手册:1137332 CP341使用手册:1117397 CP440使用手册:2042641 CP441使用手册:1137419 ET200S串行接口模块手册:9260793 MODBUS RTU主站手册:1220184 MODBUS RTU从站手册:1218007 CP 340 PtP 打印功能手册:16527390 CP341 Loadable Modbus ASCII driver (Master) 25362836 Manual for CP341 Loadable Modbus ASCII Slave Driver 25380100 SIMATIC Data Highway (DF1) 参考手册: 1218110 关于西门子串行通信应用的文档可以参考相关产品手册,或登录下载中心网站 https://www.360docs.net/doc/e67016168.html,/download/ ,搜索下载如下文档:

常用通讯测试工具使用

常用通讯测试工具 鉴于很多MCGS用户和技术人员对通讯测试工具并不很熟悉,本文档将针对实际的测试情况,对串口、以太网通讯调试过程中所涉及到的常用的测试软件进行相关的讲解。 1. 串口测试工具: 串口调试工具:用来模拟上下位机收发数据的串口工具,占用串口资源。如:串口调试助手,串口精灵,Comm等。 串口监听工具:用来监听上下位机串口相关操作,并截获收发数据的串口工具。不占用串口资源。如:PortMon,ComSky等。 串口模拟工具:用来模拟物理串口的操作,其模拟生成的串口为成对出现,并可被大多数串口调试和监听软件正常识别,是串口测试的绝好工具。如:Visual Serial Port等。 下面将分别介绍串口调试助手、Comm、PortMon和Visual Serial Port的使用。

1.1. 串口调试助手: 为最常用的串口收发测试工具,其各区域说明及操作过程如下: 串口状态 打开/关闭串口 十六进制/ASCII 切换 串口数据 接收区 串口参数 设置区 串口数据 发送区 串口收发计数区 发送数据功能区 保存数据功能区 操作流程如下: ? 设置串口参数(之前先关闭串口)。 ? 设置接收字符类型(十六进制/ASCII 码) ? 设置保存数据的目录路径。 ? 打开串口。 ? 输入发送数据(类型应与接收相同)。 ? 手动或自动发送数据。 ? 点击“保存显示数据”保存接收数据区数据到文件RecXX.txt。 ? 关闭串口。 注:如果没有相应串口或串口被占用时,软件会弹出“没有发现此串口”的提示。

1.2. PortMon 串口监听工具: 用来监听上下位机串口相关操作,并截获收发数据的串口工具。不占用串口资源, 但在进行监听前,要保证相应串口不被占用,否则无法正常监听数据。 连接状态 菜单栏 工具栏 截获数据显示区 PortMon 设置及使用: 1). 确保要监听的串口未被占用。 如果串口被占用,请关闭相应串口的应用程序。比如:要监视MCGS 软件与串口1设备通讯,应该先关闭MCGS 软件。 说明:PortMon 虽不占用串口资源,但在使用前必须确保要监听的串口未被占用,否则无法进行监视。 2). 运行PortMon,并进行相应设置。 ? 连接设置: 在菜单栏选择“计算机(M)”->“连接本地(L)”。如果连接成功,则连接状态显示为“PortMon 于\\计算机名(本地)”。如下图:

串口通信原理

一、串口通信原理 串口通讯对单片机而言意义重大,不但可以实现将单片机的数据传输到计算机端,而且也能实现计算机对单片机的控制。由于其所需电缆线少,接线简单,所以在较远距离传输中,得到了广泛的运用。串口通信的工作原理请同学们参看教科书。 以下对串口通信中一些需要同学们注意的地方作一点说明: 1、波特率选择 波特率(Boud Rate)就是在串口通信中每秒能够发送的位数(bits/second)。MSC- 51串行端口在四种工作模式下有不同的波特率计算方法。其中,模式0和模式2波特率计算很简单,请同学们参看教科书;模式1和模式3的波特率选择相同,故在此仅以工作模式1为例来说明串口通信波特率的选择。 在串行端口工作于模式1,其波特率将由计时/计数器1来产生,通常设置定时器工作于模式2(自动再加模式)。在此模式下波特率计算公式为: 波特率=(1+SMOD)*晶振频率/(384*(256-TH1)) 其中,SMOD——寄存器PCON的第7位,称为波特率倍增位; TH1——定时器的重载值。 在选择波特率的时候需要考虑两点:首先,系统需要的通信速率。这要根据系统的运作特点,确定通信的频率范围。然后考虑通信时钟误差。使用同一晶振频率在选择不同的通信速率时通信时钟误差会有很大差别。为了通信的稳定,我们应该尽量选择时钟误差最小的频率进行通信。 下面举例说明波特率选择过程:假设系统要求的通信频率在20000bit/s以下,晶振频率为12MHz,设置SMOD=1(即波特率倍增)。则 TH1=256-62500/波特率 根据波特率取值表,我们知道可以选取的波特率有:1200,2400,4800,9600,19200。列计数器重载值,通信误差如下表: 因此,在通信中,最好选用波特率为1200,2400,4800中的一个。 2、通信协议的使用 通信协议是通信设备在通信前的约定。单片机、计算机有了协议这种约定,通信双方才能明白对方的意图,以进行下一步动作。假定我们需要在PC机与单片机之间进行通信,在双方程式设计过程中,有如下约定: 0xA1:单片机读取P0端口数据,并将读取数据返回PC机; 0xA2:单片机从PC机接收一段控制数据; 0xA3:单片机操作成功信息。 在系统工作过程中,单片机接收到PC机数据信息后,便查找协议,完成相应的操作。当单片机接收到0xA1时,读取P0端口数据,并将读取数据返回PC机;当单片机接收到0xA2时,单片机等待从PC机接收一段控制数据;当PC机接收到0xA3时,就表明单片机操作已经成功。 3、硬件连接 51单片机有一个全双工的串行通讯口,所以单片机和计算机之间可以方便地进行串口

C#中串口通信编程

本文将介绍如何在.NET平台下使用C#创建串口通信程序,.NET 2.0提供了串口通信的功能,其命名 空间是System.IO.Ports。这个新的框架不但可以访问计算机上的串口,还可以和串口设备进行通信。 我们将使用标准的RS 232 C 在PC间通信。它工作在全双工模式下,而且我们不打算使用任何的握手或流控制器,而是使用无modem连接。 命名空间 System.IO.Ports命名空间中最重用的是SerialPort 类。 创建SerialPort 对象 通过创建SerialPort 对象,我们可以在程序中控制串口通信的全过程。 我们将要用到的SerialPort 类的方法: ReadLine():从输入缓冲区读一新行的值,如果没有,会返回NULL WriteLine(string):写入输出缓冲 Open():打开一个新的串口连接 Close():关闭 Code: //create a Serial Port object SerialPort sp = new SerialPort (); 默认情况下,DataBits 值是8,StopBits 是1,通信端口是COM1。这些都可以在下面的属性中重新设置: BaudRate:串口的波特率 StopBits:每个字节的停止位数量 ReadTimeout:当读操作没有完成时的停止时间。单位,毫秒 还有不少其它公共属性,自己查阅MSDN。

串口的硬件知识 在数据传输的时候,每个字节的数据通过单个的电缆线传输。包包括开始位,数据,结束为。一旦 开始位传出,后面就会传数据,可能是5,6,7或8位,就看你的设定了。发送和接收必须设定同样 的波特率和数据位数。 无猫模式 没有Modem模式的电缆只是简单地交叉传送和接收线。同样DTR & DSR, 和 RTS & CTS也需要交叉。RS232针图 这里,我们三条线。互连2和3(一段的2pin连接3pin),连接两端的5pin。 [示例程序] 主程序

关于串口通信(232、485、422)和常见问题

下面先讲串口通信的一些基本概念,术语。如果对串口通信比较熟悉的,就当复习,如果哪里讲的不到位,欢迎及时指出。 这里并不对串口的编程作讲解,主要是从应用的角度去讲一讲。因为更多的时候,都是产品做好了,比如触摸屏需要和控制器,PLC通信。理想的情况下,一般只要一上电,不需要太多的操作和配置,就可以通信上。 文章后半部分罗列了一些相关问题,在解答前还需要先了解一下什么是串口通信,232,485,422等。 什么是串口通信 常见的串口通信一般是指异步串行通信。 这里就要说一下同步和异步的区别了。 先讲一下串行通信的概念。那么,与串行通信相对的是什么呢? 与串行通信相对的是并行通信。数据传输一般都是以字节传输的,一个字节8个位。拿一个并行通信举例来说,也就是会有8根线,每一根线代表一个位。一次传输就可以传一个字节,而串口通信,就是传数据只有一根线传输,一次只能传一个位,要传一个字节就需要传8次。就像小虎队那首歌一样,把你的心,我的心,串一串,再烤一烤。。串口通信就是把数据串在一根线上传输,所以就叫串口吧。

与异步通信相对的就是同步通信了。同步通信一般是指有一个时钟信号进行数据信号同步。同步通信对接收方来说就相对简单一些。因为有时钟信号在,每一个高低电平变化一下,就去取一下数据就行了。通信速率可以由发送方或者说是主站设备进行控制。通信速度也相对比串口通信快很多。但是为什么很多设备,屏和plc,控制器不采用这种方式,都使用串口呢。 那么,在很多设备上,不方便接太多线,比如接8根数据线,也不方便接同步时钟信号(这个后面再说),于是一种异步串行通信就诞生了。 相对来说,异步串口通信,就只需要一根线就可以发送数据了。在对速率要求不高的情况,使用一根线发送数据是带来大大的方便和实用价值的。 那么问题来了,怎么样才能保证一根线就能发送正常的数据呢。也就说发送方发送的数据,接收方是怎么知道是什么数据呢。 为了能正常发送数据和接收正确的数据,那异步串口通信就需要满足以下几个条件: 也就是双方必要约定一种暗号。 也许当时发送这个通信的小组是这样讨论的。 经理:我要用一根线就能传输数据,你来给我定个标准。

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操 作;

串行通信模块常见问题集

串行通信模块常见问题集 FAQ Collection for Serial Communication Module

摘要本文收集归纳了SIMATIC S7系列串行通信模块的常见问题及其解答,供用户在产品选型、订货,系统设计、调试及维护过程中参考。 关键词串行通信,常见问题,PtP,ASCII,MODBUS Key Words Serial Communication,FAQ,PtP,ASCII,MODBUS IA&DT Service & Support Page 2-24

目录 问题1:SIMATIC S7系列有哪些用于串行通信的模块? (5) 问题2:SIMATIC S7系列串行通信模块的订货信息? (5) 问题3:在哪里可以找到串行通信模块的手册和相关文档? (6) 问题4:在哪里可以找到串行通信模块的驱动软件包? (8) 问题5:RS232C、RS422和RS485通信接口的属性和特点? (8) 问题6:RS232C接口都有什么针脚及针脚定义? (9) 问题7:各种通信接口的设备连接时需要注意哪些? (9) 问题8:CP340与CP341有哪些区别? (10) 问题9:CP441-1和CP441-2的区别在哪里? (10) 问题10: CP441与CP340/CP341的应用中有哪些区别? (10) 问题11:在一个 S7-300 CPU 上最多可以挂多少个 CP 340模块? (11) 问题12:为什么在 CP342-5 作为主站的 ET200M 中不可以使用 CP340 或CP341 ? (11) 问题13:CP340/CP341能否挂在IM365的扩展机架上? (11) 问题14:两个对象之间进行串行通信,需要满足哪些前提条件? (11) 问题15:串行通信的字符帧格式是如何定义的? (12) 问题16:ASCII/3964(R)/RK512/MODBUS/DF1协议有什么属性,各自有什么优点和性能? (12) 问题17:ASCII协议接收数据时,怎么选择接收结束标准? (12) 问题18:传输控制功能在串行通信中有什么作用,怎么使用? (13) 问题19:为什么安装了PtP 驱动程序后不能配置CP340-1CH02 和CP441-2AA04? (13) 问题20:最新版本CP341增加了哪些新功能? (13) 问题21:怎么更新 CP340/CP341 的固件版本? (14) 问题22:CP340/CP341通信模块的接收缓冲区大小,最多可以缓存多少数据? (14) 问题23:在CP340/CP341的诊断缓冲区中怎么显示诊断信息条目的时钟信息? (14) 问题24:有哪些用于串行通信功能块? (15) 问题25:CP340/CP341通信功能块使用时需要注意哪些? (15) 问题26:可以通过哪些方法诊断通信模块? (15) 问题27:CP341的SF灯亮说明什么? (16) 问题28:为什么使用RS485通讯不正常,有哪些原因? (16) 问题29:在使用CP340/CP341进行通信时,怎么判断接线是否正确? (17) 问题30:可以采取哪些措施保证接收缓冲区不溢出? (17) 问题31:如何接收较大长度数据帧(大于接收缓冲区)的数据? (17) 问题32:MODBUS RTU与MODBUS ASCII的区别? (17) 问题33:S7-300作MODBUS RTU通信时,需要选择哪些硬件和软件? (18) 问题34:什么时候需要下载MODBUS RTU装载协议? (18) 问题35:CP341/CP441-2的加载驱动程序存储在哪里? (18) 问题36:如何给在S7-400H系统中的CP341装载MODBUS驱动程序? (19) 问题37:CP341-RS485作MODBUS主站时,可以连接多少个从站设备? (19) 问题38:怎么构建一个RS422/485的多点网络? (19) 问题39:如何计算MODBUS地址? (20) 问题40: CP341/CP441-2作MODBUS通信时的功能码与地址对应关系? (20) 问题41:CP341/CP441作MODBUS主站通信的传输时间怎么计算? (20) 问题42:CP341的FB8(P_SND_RK)功能块DONE位什么时候为“1”? (21) IA&DT Service & Support Page 3-24

相关文档
最新文档