搜档网
当前位置:搜档网 › 解析MWC的串口通讯正式版20130407

解析MWC的串口通讯正式版20130407

解析MWC的串口通讯正式版20130407
解析MWC的串口通讯正式版20130407

解析MWC的串口通讯

一使用的软件

二使用的MWC定义串口协议文件

updated 04 July

Multiwii serial protocol was redesigned:

? to be light, as before

? to be generic: it can be used transparenlty by a GUI, OSD, telemetry or home made config tool.

ie no more specific OSD code should be coded in multiwii

? to be bit wire efficient: only requested data are transmitted in a binary format

? to be quite secure: data are sent with a checksum, preventing corrupted configuration to be injected.

? to be header sensitive: as it is design ed with a specific header, it can be mixed with other frame, like GPS frame

ie, it will be possible to connect either a GUI or a GPS on the same serial port without changing the conf ? to be less sensitive to evolutions:

ie in case of parameter evolution, the main protocol will remain compatible and the GUI will be much less version dependent.

variable data length allows to consider only the beginning of a message, leaving the other octets at the end to extend transparently the message (for instance to add a new PID)

I thought first about an implementation of Mavlink, but I think it's not what I was looking for.

Even with a partial implementation, the predefined structures are not light enough for what I have in mind. Some messages are however inspired from mavlink structure.

The main rule remains: Multiwii never sends something on its own.

A request must be done in each case to retrieve or set data.

Each messages received are acknowledged even if there is no data inside.

There are 2 main messages to consider:

?request message to multiwii

?multiwii output message

request message to multiwii

To request simple data without parameters / send a specific command / inject new parameters in multiwii

$M>[data length][code][data][checksum]

1 octet '$'

1 octet 'M'

1 octet '<'

1 octet [data length]

1 octet [code]

several octets [data]

1 octet [checksum]

[data length] can be 0 in case of no param command

multiwii output message

messages are formated like this:

$M>[data length][code][data][checksum]

1 octet '$'

1 octet 'M'

1 octet '>'

1 octet [data length]

1 octet [code]

several octets [data]

1 octet [checksum]

if the message is unknown:

$M|[0][code][checksum]

1 octet '$'

1 octet 'M'

1 octet '|'

1 octet 0

1 octet [unknown code]

1 octet [checksum]

三、对写入MWC的原文件分析

void serialCom() {//① MWC通过c = SerialRead(CURRENTPORT);解析缓冲区的数据

uint8_t c,n;

static uint8_t offset[UART_NUMBER];

static uint8_t dataSize[UART_NUMBER];

static enum _serial_state { //串口的几种状态

IDLE, //空闲?

HEADER_START, //数据头开始 $

HEADER_M, //数据头 M

HEADER_ARROW, //数据箭头《

HEADER_SIZE, //数据尺寸

HEADER_CMD, //指令

} c_state[UART_NUMBER];// = IDLE;//状态数组默认空闲

for(n=0;n

CURRENTPORT=n;

#endif

#define GPS_COND //假如定义了GPS_COND 执行该段代码

#if defined(GPS_SERIAL)

#if defined(GPS_PROMINI)

#define GPS_COND

#else

#define GPS_COND && (GPS_SERIAL != CURRENTPORT)

#endif

#endif

#define SPEK_COND //假如定义了SPEK_COND 执行该段代码

#if defined(SPEKTRUM) && (UART_NUMBER > 1)

#define SPEK_COND && (SPEK_SERIAL_PORT != CURRENTPORT)

#endif

while (SerialAvailable(CURRENTPORT) GPS_COND SPEK_COND){//③while循环

uint8_t bytesTXBuff = ((uint8_t)(serialHeadTX[CURRENTPORT]-serialTailTX[CURRENTPORT]))%TX_BUFFER_SIZE;

// indicates the number of occupied bytes in TX buffer 发送缓冲区占用字节标定。

if (bytesTXBuff > TX_BUFFER_SIZE - 50 ) return;

// ensure there is enough free TX buffer to go further (50 bytes margin) 确保发送缓冲区之手50字节的余量。

c = SerialRead(CURRENTPORT); //读串口缓冲区serialBufferRX[数据指针][串口端口号],该缓冲区的数据是由串口接收

中断函数inline store_uart_in_buf(uint8_t data, uint8_t portnum)获取的来自电脑的

数据。

if (c_state[CURRENTPORT] == IDLE) //这是一组完整指令代码24 4D 3C 00 64 64 $M<\#0dd { //串口状态空闲等待HEADER_START状态的到来。

c_state[CURRENTPORT] = (c=='$') ? HEADER_START : IDLE;//判定是$字符吗?是进入HEADER_START状态。

if (c_state[CURRENTPORT] == IDLE) evaluateOtherData(c); // evaluate all other incoming serial data

}

else if (c_state[CURRENTPORT] == HEADER_START)

{

c_state[CURRENTPORT] = (c=='M') ? HEADER_M : IDLE;

}

else if (c_state[CURRENTPORT] == HEADER_M)

{

c_state[CURRENTPORT] = (c=='<') ? HEADER_ARROW : IDLE;//是字符<吗?是表示有数据要进入MWC,此前发送都是数据头。

}

else if (c_state[CURRENTPORT] == HEADER_ARROW)

{//是ARROW字符,判定缓冲区的大小。

if (c > INBUF_SIZE)

{ // now we are expecting the payload size 我们期望足够的数据占用缓冲区。

c_state[CURRENTPORT] = IDLE;//数据位置不够退出循环。

continue; //不执行该while循环包含的后面的语句,跳出开始下一轮循环。

}

dataSize[CURRENTPORT] = c;//缓冲区够,将收到的数据赋值给当前端口的数据尺寸数组dataSize[串口端口号]。

offset[CURRENTPORT] = 0;//设置数据指针的偏移位0。

checksum[CURRENTPORT] = 0;//初始化数据的校验和为0。存入数组中。

checksum[CURRENTPORT] ^= c;//说明数据长度是校验的第一个字母。

c_state[CURRENTPORT] = HEADER_SIZE; // the command is to follow

//MWC收到数据长度,后面就是电脑发送的数据了。MWC串口状态进入HWADER_SIZE。

}

else if (c_state[CURRENTPORT] == HEADER_SIZE)

{//MWC串口是在HEADER_SIZE状态吗?

cmdMSP[CURRENTPORT] = c;//在HEADER_SIZE状态收到的第一个数据是指令。

checksum[CURRENTPORT] ^= c;//将该数据异或进入校验和的数组中去。

c_state[CURRENTPORT] = HEADER_CMD;//MWC收到数据后,说明在指令状态,MWC进入HEAFER_CMD状态。

}

else if (c_state[CURRENTPORT] == HEADER_CMD && offset[CURRENTPORT] < dataSize[CURRENTPORT]) {

checksum[CURRENTPORT] ^= c;//进入校验和异或。

inBuf[offset[CURRENTPORT]++][CURRENTPORT] = c;//MWC将收到的电脑数据存入缓冲区内。offset[CURRENTPORT]加1。

}

else if (c_state[CURRENTPORT] == HEADER_CMD && offset[CURRENTPORT] >= dataSize[CURRENTPORT]) {

//判定偏移指针大于等于数据预留位置大小吗?

if (checksum[CURRENTPORT] == c)

{ // compare calculated and transferred checksum

//偏移指针大于等于数据预留位置大小,就将从电脑这次收到的数据作为校验和,与已经累计异或的checksum[]中的校验和数据对比,为真,表示,该数据包是有效的,可以调用下面的函数evaluateCommand()进行,数据包的解析。

evaluateCommand(); // we got a valid packet, evaluate it我们获得了一个有效的数据包,解析评估这些数据。 }

c_state[CURRENTPORT] = IDLE;//MWC串口开始进入空闲状态。

}

}//③while循环

}//②for循环

}①

四、对MWC的配置文件的原文件分析

…………

if ((time-time2)>40 && ! toggleRead && ! toggleWrite) {//不按读写按钮发送的78个数据

time2=time;

int[] requests= {MSP_IDENT, MSP_MOTOR_PINS, MSP_STATUS, MSP_RAW_IMU, MSP_SERVO, MSP_MOTOR, MSP_RC, MSP_RAW_GPS, MSP_COMP_GPS, MSP_ALTITUDE, MSP_BAT, MSP_DEBUGMSG, MSP_DEBUG};

//100=d 115=s 102=f 103=g 104=h 105=I 106=j 107=k 109=m 110=n 253 254

sendRequestMSP(requestMSP(requests));

}

if ((time-time3)>20 && ! toggleRead && ! toggleWrite) {

sendRequestMSP(requestMSP(MSP_ATTITUDE));//108=l

time3=time;

}

if (toggleReset) {

toggleReset=false;

sendRequestMSP(requestMSP(MSP_RESET_CONF));//MSP_RESET_COF=208

}

if (toggleRead) {//只要按读按钮就发送下面的代码36个

toggleRead=false;

int[] requests= {MSP_BOXNAMES, MSP_PIDNAMES, MSP_RC_TUNING, MSP_PID, MSP_BOX, MSP_MISC };//116=t 117=u 111=o 112=p 113=q 114=r

sendRequestMSP(requestMSP(requests));

buttonWRITE.setColorBackground(green_);

}

if (toggleCalibAcc) {

toggleCalibAcc=false;

sendRequestMSP(requestMSP(MSP_ACC_CALIBRATION));

}

if (toggleCalibMag) {

toggleCalibMag=false;

sendRequestMSP(requestMSP(MSP_MAG_CALIBRATION));

}

if (toggleWrite) {

toggleWrite=false;

// MSP_SET_RC_TUNING

payload = new ArrayList();

payload.add(char( round(confRC_RATE.value()*100)) );

payload.add(char( round(confRC_EXPO.value()*100)) );

payload.add(char( round(rollPitchRate.value()*100)) );

payload.add(char( round(yawRate.value()*100)) );

payload.add(char( round(dynamic_THR_PID.value()*100)) );

payload.add(char( round(throttle_MID.value()*100)) );

payload.add(char( round(throttle_EXPO.value()*100)) );

sendRequestMSP(requestMSP(MSP_SET_RC_TUNING,payload.toArray( new Character[payload.size()]) ));

// MSP_SET_PID

payload = new ArrayList();

for(i=0;i

byteP[i] = (round(confP[i].value()*10));

byteI[i] = (round(confI[i].value()*1000));

byteD[i] = (round(confD[i].value()));

}

…………………..

五、MWC处理指令的代码分析

void evaluateCommand() {

switch(cmdMSP[CURRENTPORT]) {

case MSP_SET_RAW_RC:

for(uint8_t i=0;i<8;i++) {

}

headSerialReply(0);

break;

#if GPS

case MSP_SET_RAW_GPS:

f.GPS_FIX = read8();

GPS_numSat = read8();

GPS_coord[LAT] = read32();

GPS_coord[LON] = read32();

GPS_altitude = read16();

GPS_speed = read16();

GPS_update |= 2; // New data signalisation to GPS functions headSerialReply(0);

break;

#endif

case MSP_SET_PID:

for(uint8_t i=0;i

conf.P8[i]=read8(); //处理来自电脑的数据从inBuf[]数组中

conf.I8[i]=read8();

conf.D8[i]=read8();

}

headSerialReply(0); //处理完成后向电脑发送“$M>\#0\#0MSP_SET_PID”

break;

case MSP_SET_BOX:

for(uint8_t i=0;i

conf.activate[i]=read16();

}

headSerialReply(0);

break;

case MSP_SET_RC_TUNING:

conf.rcRate8 = read8();

conf.rcExpo8 = read8();

conf.rollPitchRate = read8();

conf.yawRate = read8();

conf.dynThrPID = read8();

conf.thrMid8 = read8();

conf.thrExpo8 = read8();

headSerialReply(0);

break;

case MSP_SET_MISC:

#if defined(POWERMETER)

conf.powerTrigger1 = read16() / PLEVELSCALE;

#endif

headSerialReply(0);

break;

case MSP_IDENT:

headSerialReply(7);

serialize8(MULTITYPE); // type of multicopter

serialize8(MSP_VERSION); // MultiWii Serial Protocol Version

serialize32(0); // "capability"

break;

case MSP_STATUS:

headSerialReply(10);

serialize16(cycleTime);

serialize16(i2c_errors_count);

serialize16(ACC|BARO<<1|MAG<<2|GPS<<3|SONAR<<4);

serialize32(

#if ACC

f.ANGLE_MODE<

f.HORIZON_MODE<

#endif

#if BARO && (!defined(SUPPRESS_BARO_ALTHOLD))

f.BARO_MODE<

#endif

#if MAG

f.MAG_MODE<

#if defined(SERVO_TILT) || defined(GIMBAL)

rcOptions[BOXCAMSTAB]<

#endif

#if defined(CAMTRIG)

rcOptions[BOXCAMTRIG]<

#endif

#if GPS

f.GPS_HOME_MODE<

#endif

#if defined(FIXEDWING) || defined(HELICOPTER) || defined(INFLIGHT_ACC_CALIBRATION) f.PASSTHRU_MODE<

#endif

#if defined(BUZZER)

rcOptions[BOXBEEPERON]<

#endif

#if defined(LED_FLASHER)

rcOptions[BOXLEDMAX]<

#endif

#if defined(LANDING_LIGHTS_DDR)

rcOptions[BOXLLIGHTS]<

#endif

f.ARMED<

break;

case MSP_RAW_IMU:

headSerialReply(18);

for(uint8_t i=0;i<3;i++) serialize16(accSmooth[i]);

for(uint8_t i=0;i<3;i++) serialize16(gyroData[i]);

break;

case MSP_SERVO:

headSerialReply(16);//发送数据头包括数据长度指令码初始化校验和 for(uint8_t i=0;i<8;i++)

#if defined(SERVO)

serialize16(servo[i]);

#else

serialize16(0);

#endif

break;

case MSP_MOTOR:

headSerialReply(16);

for(uint8_t i=0;i<8;i++) {

serialize16( (i < NUMBER_MOTOR) ? motor[i] : 0 );

}

break;

case MSP_RC:

headSerialReply(16);

for(uint8_t i=0;i<8;i++) serialize16(rcData[i]);

break;

#if GPS

case MSP_RAW_GPS:

headSerialReply(14);

serialize8(f.GPS_FIX);

serialize8(GPS_numSat);

serialize32(GPS_coord[LAT]);

serialize32(GPS_coord[LON]);

serialize16(GPS_altitude);

serialize16(GPS_speed);

break;

case MSP_COMP_GPS:

headSerialReply(5);

serialize16(GPS_distanceToHome);

serialize16(GPS_directionToHome);

serialize8(GPS_update & 1);

break;

#endif

case MSP_ATTITUDE:

headSerialReply(8);

for(uint8_t i=0;i<2;i++) serialize16(angle[i]);

serialize16(heading);

serialize16(headFreeModeHold);

break;

case MSP_ALTITUDE:

headSerialReply(4);

serialize32(EstAlt);

break;

headSerialReply(3);

serialize8(vbat);

serialize16(intPowerMeterSum);

break;

case MSP_RC_TUNING:

headSerialReply(7);

serialize8(conf.rcRate8);

serialize8(conf.rcExpo8);

serialize8(conf.rollPitchRate);

serialize8(conf.yawRate);

serialize8(conf.dynThrPID);

serialize8(conf.thrMid8);

serialize8(conf.thrExpo8);

break;

case MSP_PID:

headSerialReply(3*PIDITEMS);

for(uint8_t i=0;i

serialize8(conf.P8[i]);

serialize8(conf.I8[i]);

serialize8(conf.D8[i]);

}

break;

case MSP_BOX:

headSerialReply(2*CHECKBOXITEMS);

for(uint8_t i=0;i

}

break;

case MSP_BOXNAMES:

headSerialReply(strlen_P(boxnames)); serializeNames(boxnames);

break;

case MSP_PIDNAMES:

headSerialReply(strlen_P(pidnames)); serializeNames(pidnames);

break;

case MSP_MISC:

headSerialReply(2);

serialize16(intPowerTrigger1);

break;

case MSP_MOTOR_PINS:

headSerialReply(8);

for(uint8_t i=0;i<8;i++) {

serialize8(PWM_PIN[i]);

}

break;

#if defined(USE_MSP_WP)

{

uint8_t wp_no = read8(); //get the wp number

headSerialReply(12);

if (wp_no == 0) {

serialize8(0); //wp0

serialize32(GPS_home[LAT]);

serialize32(GPS_home[LON]);

serialize16(0); //altitude will come here

serialize8(0); //nav flag will come here

} else if (wp_no == 16)

{

serialize8(16); //wp16

serialize32(GPS_hold[LAT]);

serialize32(GPS_hold[LON]);

serialize16(0); //altitude will come here

serialize8(0); //nav flag will come here

}

}

break;

#endif

case MSP_RESET_CONF:

if(!f.ARMED) {

conf.checkNewConf++;

checkFirstTime();

}

headSerialReply(0);

break;

case MSP_ACC_CALIBRATION:

if(!f.ARMED) calibratingA=400;

headSerialReply(0);

break;

case MSP_MAG_CALIBRATION:

if(!f.ARMED) f.CALIBRATE_MAG = 1;

headSerialReply(0);

break;

case MSP_EEPROM_WRITE:

writeParams(0);

headSerialReply(0);

break;

case MSP_DEBUG:

headSerialReply(8);

for(uint8_t i=0;i<4;i++) {

serialize16(debug[i]); // 4 variables are here for general monitoring purpose }

break;

#ifdef DEBUGMSG

case MSP_DEBUGMSG:

uint8_t size = debugmsg_available();

if (size > 16) size = 16;

headSerialReply(size);

debugmsg_serialize(size);

}

break;

#endif

default: // we do not know how to handle the (valid) message, indicate error MSP $M!

headSerialError(0);

break;

}

tailSerialReply();//上面case执行完成后,发送最后一个数据实际就是发送校验和。

}

二、测试过程

1、打开32位MWC配置软件选择串行口按erad读取数据

2、打开串口监视精灵特别是115200波特率的选择十分重要,因为MWC的软件就是这样写的,设定的。

●监视到的原始数据

COM3,Wirte(36): $M<\#0tt$M<\#0uu$M<\#0oo$M<\#0pp$M<\#0qq$M<\#0rr

COM3, Read(1): $

COM3, Read(1): M

COM3, Read(1): >

COM3, Read(1): ,

COM3, Read(1): t

COM3, Read(1): A

COM3, Read(1): N

COM3, Read(1): G

COM3, Read(1): L

COM3, Read(1): M

……………………..

COM3, Read(1): \#0

COM3, Read(1): \#0

COM3, Read(1): \#0

COM3, Read(1): \#0

COM3, Read(1): ?

COM3, Read(1): $

COM3, Read(1): M

COM3, Read(1): >

COM3, Read(1): \#2

COM3, Read(1): r

COM3, Read(1): \#0

COM3, Read(1): \#0

COM3, Read(1): p

COM3,Wirte(78):

$M<\#0dd$M<\#0ss$M<\#0ee$M<\#0ff$M<\#0gg$M<\#0hh$M<\#0ii$M<\#0jj$M<\#0kk$M<\#0mm$M<\#0nn$M<\#0yy$M<\#0

COM3,Wirte(6): $M<\#0ll COM3, Read(1): $

COM3, Read(1): M

COM3, Read(1): >

COM3, Read(1): \#7 COM3, Read(1): d

COM3, Read(1): ó

COM3, Read(1): \#2 COM3, Read(1): \#0 COM3, Read(1): \#0 COM3, Read(1): \#0 COM3, Read(1): \#0 COM3, Read(1): \#0 COM3, Read(1): 2

COM3, Read(1): $

COM3, Read(1): M

COM3, Read(1): >

COM3, Read(1): \#8 COM3, Read(1): s

COM3, Read(1): \#9 COM3, Read(1): \#10 COM3, Read(1): \#11 COM3, Read(1): \#3 COM3, Read(1): \#6 COM3, Read(1): \#5 COM3, Read(1): \#16 COM3, Read(1): \#12 COM3, Read(1): o

COM3, Read(1): $

COM3, Read(1): M

COM3, Read(1): >

COM3, Read(1): \#10 COM3, Read(1): e

COM3, Read(1):

COM3, Read(1): \#11 COM3, Read(1): \#0 COM3, Read(1): \#0 COM3, Read(1): \#7 COM3, Read(1): \#0 COM3, Read(1): \#0 COM3, Read(1): \#0 COM3, Read(1): \#0 COM3, Read(1): \#0 COM3, Read(1): ?………………………….. COM3, Read(1): M

COM3, Read(1): !

COM3, Read(1): y

COM3, Read(1): y

COM3, Read(1): $

COM3, Read(1): M

COM3, Read(1): >

COM3, Read(1): \#8

COM3, Read(1): t

COM3, Read(1): \#0

COM3, Read(1): \#0

COM3, Read(1): \#17

COM3, Read(1): \#0

COM3, Read(1): \#2

COM3, Read(1): \#0

COM3, Read(1): –

COM3, Read(1): ?

COM3, Read(1): ?

COM3, Read(1): $

COM3, Read(1): M

COM3, Read(1): >

COM3, Read(1): \#8

COM3, Read(1): l

COM3, Read(1): t

COM3, Read(1): ?

COM3, Read(1): ú

COM3, Read(1): ?

COM3, Read(1): ?

COM3, Read(1): ?

COM3, Read(1): \#0

COM3, Read(1): \#0

COM3, Read(1): Q

COM3,Wirte(78):

$M<\#0dd$M<\#0ss$M<\#0ee$M<\#0ff$M<\#0gg$M<\#0hh$M<\#0ii$M<\#0jj$M<\#0kk$M<\#0 mm$M<\#0nn$M<\#0yy$M<\#0tt

COM3,Wirte(6): $M<\#0ll

COM3, Read(1): $

COM3, Read(1): M

COM3, Read(1): >

●实际分析出电脑到MWC的数据有三种

开始是COM3,Wirte(36): $M<\#0tt$M<\#0uu$M<\#0oo$M<\#0pp$M<\#0qq$M<\#0rr

中间循环发送

COM3,Wirte(78):$M<\#0dd$M<\#0ss$M<\#0ee$M<\#0ff$M<\#0gg$M<\#0hh$M<\#0ii$M<\#0jj$M<\#0kk$M<\#0mm$M<\#0n n$M<\#0yy$M<\#0tt

COM3,Wirte(6): $M<\#0ll

3、使用八爪鱼发送指令收到信息

●先发送了78个字节的13条指令

$M<\#0dd$M<\#0ss$M<\#0ee$M<\#0ff$M<\#0gg$M<\#0hh$M<\#0ii$M<\#0jj$M<\#0kk$M<\#0mm$M<\#0nn$M<\#0yy$M<\ #0tt

24 4D 3C 00 64 64 24 4D 3C 00 73 73 24 4D 3C 00 65 65 24 4D 3C 00 66 66 24 4D 3C 00 67 67 24 4D 3C 00 68 68 24 4D 3C 00 69 69 24 4D 3C 00 6A 6A 24 4D 3C 00 6B 6B 24 4D 3C 00 6D 6D 24 4D 3C 00 6E 6E 24 4D 3C 00 FD FD 24 4D 3C 00 FE FE有数据返回如下图。

●接着发送12字节2条指令

$M<\#0dd$M<\#0ss

24 4D 3C 00 64 64 24 4D 3C 00 73 73有数据返回如下图

●再发送6字节1条指令

$M<\#0dd

24 4D 3C 00 64 64 有数据返回如下图

4使用串口监视精灵发送指令的监视结果如下

●发射数据

●接收到的数据

最新单片微机原理及应用 徐春辉第10章 习题答案51系列单片机的串行通信习题与思考题答案

练习与思考题10 1.串行数据传送的主要优点和作用是什么? 答:串行数据传送的主要优点是硬件接口简单,接口端口少(2个)。主要用于微机之间或微机与外设之间的数据通信。 2.单工、半双工、全双工通信有什么异同? 答:相同之处在于都是串行通信; 单工方式:数据仅按一个固定方向传送。 半双工方式:数据可实现双向传送,但不能同时进行。 全双工方式:允许通信双方同时进行数据双向传送。。 3.假定串行口串行发送的字符格式为1个起始位,8个数据位,1个奇校验位,1个停止位, 请画出传送字符“F”的帧格式。 起始位0 1 1 0 0 0 1 0 校验位0 停止位 4.若异步通信接口按方式3传送,已知其每分钟传送3600个字符,其波特率是多少? 答:已知每分钟传送3600个字符,方式3每个字符11位,则: 波特率=(11b/字符)×(3600字符/60s)=660b/s 5.AT89S51单片机的串行口由哪些功能部件组成?各有什么作用? 答:AT89S51单片机的串行接口由发送缓冲器SBUF,接收缓冲器SBUF、输入移位寄存器、串行接口控制器SCON、定时器T1构成的波特率发生器等部件组成。 由发送缓冲期SBUF发送数据,接收缓冲期SBUF接收数据。串行接口通信的工作方式选择、接收和发送控制及状态等均由串行接口控制寄存器SCON控制和指示。定时器T1产生串行通信所需的波特率。 6.AT89S51单片机串行口有几种工作方式?有几种帧格式?各种工作方式的波特率如何 确定? 答:串行口有4种工作方式:方式0、方式1、方式2、方式3; 有3种帧格式,方式2和3具有相同的帧格式; 方式0的发送和接收都以fosc/12为固定波特率, 方式1的波特率=2SMOD/32×定时器T1的溢出率 方式2的波特率=2SMOD/64×fosc 方式3的波特率=2SMOD/32×定时器T1的溢出率 7.为什么MCS-51串行口的方式0帧格式没有起始位(0)和停止位(1)? 解答:串行口的方式0为同步移位寄存器输入输出方式,常用于外接移位寄存器,以扩展并行I/O口,一般不用于两个MCS-51之间的串行通信。该方式以fosc/12的固定波特率从低为位到高位发送或接受数据。 8.AT89S51中SCON的SM2,TB8,RB8有何作用? 答:A T89S51中SCON的SM2是多机通信控制位,主要用于方式2和方式3.若置SM2=1,则允许多机通信。 TB8是发送数据的第9位,在方式2或方式3中,根据发送数据的需要由软件置位

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位。由于数是在传输线上定时的,并且每一

基于FPGA的通用异步收发器设计(串口通信)

FPGA串行通用异步收发器设计 实验目的:1、掌握QuartusII6.0等EDA工具软件的基本使用; 2、熟悉VHDL硬件描述语言编程及其调试方法; 3、学习用FPGA实现接口电路设计。 实验内容: 本实验目标是利用FPGA逻辑资源,编程设计实现一个串行通用异步收发器。实验环境为EDA实验箱。电路设计采用VHDL硬件描述语言编程实现,开发软件为QuartusII6.0。 1、UART简介 UART(Universal Asynchronous Receiver Transmitter通用异步收发器)是一种应用广泛的短距离串行传输接口。常常用于短距离、低速、低成本的通讯中。8250、8251、NS16450等芯片都是常见的UART器件。 基本的UART通信只需要两条信号线(RXD、TXD)就可以完成数据的相互通信,接收与发送是全双工形式。TXD是UART发送端,为输出;RXD是UART接收端,为输入。 UART的基本特点是: (1)在信号线上共有两种状态,可分别用逻辑1(高电平)和逻辑0(低电平)来区分。在发送器空闲时,数据线应该保持在逻辑高电平状态。 (2)起始位(Start Bit):发送器是通过发送起始位而开始一个字符传送,起始位使数据线处于逻辑0状态,提示接受器数据传输即将开始。 (3)数据位(Data Bits):起始位之后就是传送数据位。数据位一般为8位一个字节的数据(也有6位、7位的情况),低位(LSB)在前,高位(MSB)在后。 (4)校验位(parity Bit):可以认为是一个特殊的数据位。校验位一般用来判断接收的数据位有无错误,一般是奇偶校验。在使用中,该位常常取消。 (5)停止位:停止位在最后,用以标志一个字符传送的结束,它对应于逻辑1状态。 (6)位时间:即每个位的时间宽度。起始位、数据位、校验位的位宽度是一致的,停止位有0.5位、1位、1.5位格式,一般为1位。 (7)帧:从起始位开始到停止位结束的时间间隔称之为一帧。 (8)波特率:UART的传送速率,用于说明数据传送的快慢。在串行通信中,数据是按位进行传送的,因此传送速率用每秒钟传送数据位的数目来表示,称之为波特率。如波特率9600=9600bps(位/秒)。 FPGA UART系统组成:如下图所示,FPGA UART由三个子模块组成:波特率发生器;接收模块;发送模块; 2、模块设计:

单片机串口通讯必备基础知识

单片机串口通讯必备基础知识 你想熟悉单片机,那必须先看看单片机的结构和特殊寄存器,这是你编写软件的关键。至于串口通信需要用到那些特殊功能寄存器呢,它们是SCON,TCON,TMOD,SCON等,各代表什么含义呢? SBUF 数据缓冲寄存器 这是一个可以直接寻址的串行口专用寄存器。有朋友这样问起过“为何在串行口收发中,都只是使用到同一个寄存器SBUF?而不是收发各用一个寄存器。”实际上SBUF 包含了两个独立的寄存器,一个是发送寄存,另一个是接收寄存器,但它们都共同使用同一个寻址地址-99H。CPU 在读SBUF 时会指到接收寄存器,在写时会指到发送寄存器,而且接收寄存器是双缓冲寄存器,这样可以避免接收中断没有及时的被响应,数据没有被取走,下一帧数据已到来,而造成的数据重叠问题。发送器则不需要用到双缓冲,一般情况下我们在写发送程序时也不必用到发送中断去外理发送数据。操作SBUF寄存器的方法则很简单,只要把这个99H 地址用关键字sfr定义为一个变量就可以对其进行读写操作了,如sfr SBUF = 0x99;当然你也可以用其它的名称。通常在标准的reg51.h 或at89x51.h 等头文件中已对其做了定义,只要用#include 引用就可以了。 SCON 串行口控制寄存器 通常在芯片或设备中为了监视或控制接口状态,都会引用到接口控制寄存器。SCON 就是51 芯片的串行口控制寄存器。它的寻址地址是98H,是一个可以位寻址的寄存器,作用就是监视和控制51 芯片串行口的工作状态。51 芯片的串口可以工作在几个不同的工作模式下,其工作模式的设置就是使用SCON 寄存器。它的各个位的具体定义如下: SM0 SM1 SM2 REN TB8 RB8 TI RI SM0、SM1 为串行口工作模式设置位,这样两位可以对应进行四种模式的设置。串行口工作模式设置。 SM0 SM1 模式 功能 波特率 0 0 0 同步移位寄存器 fosc/12 0 1 1 8位UART 可变 1 0 2 9位UART fosc/32 或fosc/64 1 1 3 9位UART 可变 在这里只说明最常用的模式1,其它的模式也就一一略过,有兴趣的朋友可以找相关的硬件资料查看。表中的fosc 代表振荡器的频率,也就是晶振的频率。UART 为(Universal Asynchronous Receiver)的英文缩写。

经测试的FPGA串口通信VHDL程序

实验三、FPGA串行通用异步收发器设计 实验目的:1、掌握QuartusII6.0等EDA工具软件的基本使用; 2、熟悉VHDL硬件描述语言编程及其调试方法; 3、学习用FPGA实现接口电路设计。 实验内容: 本实验目标是利用FPGA逻辑资源,编程设计实现一个串行通用异步收发器。实验环境为EDA实验箱。电路设计采用VHDL硬件描述语言编程实现,开发软件为QuartusII6.0。 1、UART简介 UART(Universal Asynchronous Receiver Transmitter通用异步收发器)是一种应用广泛的短距离串行传输接口。常常用于短距离、低速、低成本的通讯中。8250、8251、NS16450等芯片都是常见的UART器件。 基本的UART通信只需要两条信号线(RXD、TXD)就可以完成数据的相互通信,接收与发送是全双工形式。TXD是UART发送端,为输出;RXD是UART接收端,为输入。 UART的基本特点是: (1)在信号线上共有两种状态,可分别用逻辑1(高电平)和逻辑0(低电平)来区分。在发送器空闲时,数据线应该保持在逻辑高电平状态。 (2)起始位(Start Bit):发送器是通过发送起始位而开始一个字符传送,起始位使数据线处于逻辑0状态,提示接受器数据传输即将开始。 (3)数据位(Data Bits):起始位之后就是传送数据位。数据位一般为8位一个字节的数据(也有6位、7位的情况),低位(LSB)在前,高位(MSB)在后。 (4)校验位(parity Bit):可以认为是一个特殊的数据位。校验位一般用来判断接收的数据位有无错误,一般是奇偶校验。在使用中,该位常常取消。 (5)停止位:停止位在最后,用以标志一个字符传送的结束,它对应于逻辑1状态。 (6)位时间:即每个位的时间宽度。起始位、数据位、校验位的位宽度是一致的,停止位有0.5位、1位、1.5位格式,一般为1位。 (7)帧:从起始位开始到停止位结束的时间间隔称之为一帧。 (8)波特率:UART的传送速率,用于说明数据传送的快慢。在串行通信中,数据是按位进行传送的,因此传送速率用每秒钟传送数据位的数目来表示,称之为波特率。如波特率9600=9600bps(位/秒)。 UART的数据帧格式为: FPGA UART系统组成:如下图所示,FPGA UART由三个子模块组成:波特率发生器;接收模块;发送模块; 2、模块设计:

第7章PIC单片机串行口及串行通信技术.pdf

第7章PIC18FXX2串行口及串行通信技术 ?教学目标 串行通信基本知识 串行口及应用 PIC18FXX2与PC机间通信软件的设计

本章知识点概要 ? 1.什么是串行通信,串行通信有什么优点? ? 2.串行通信协议 ? 3.什么是波特率? ? 4.PIC18FXX2中的串行口工作方式及应用 ? 5.PIC18FXX2点对点通信 ?针对PIC18FXX2串行口而言,概括为以下问题: 1、波特率设计,初始化SPBRG 2、设定通信协议(工作方式选择,SYNC) 3、如何启动PIC18FXX2接收、发送数据? 4、如何检查数据是否接收或发送完毕?

7.1 7.1 串行通信基本知识串行通信基本知识 ?在实际工作中,计算机的CPU 与外部设备之间常常要进行信息交换,一台计算机与其他计算机之间也要交换信息,所有这些信息交换均可称为通信。 ?通信方式有两种,即并行通信和串行通信。 ?采用哪种通信方式?----通常根据信息传送的距离决定例如,PC 机与外部设备(如打印机等)通信时,如果距离小于30 m ,可采用并行通信方式;当距离大于30 m 时,则要采用串行通信方式。PIC18FXX2单片机具有并行和串行二种基本通信方式。

并行通信 ?并行通信是指数据的各 位同时进行传送(发送 或接收)的通信方式。 ?优点:传送速度快; ?缺点:数据有多少位, 就需要多少根传送线。 ?例如,右图PIC18FXX2 单片机与外部设备之间 的数据传送就属于并行 通信。

串行通信 ?串行通信是指数据一位(bit)一位按顺序传送的通信方式。?优点:只需一对传输线(利用电话线就可作为传输线),大大降低了传送成本,特别适用于远距离通信; ?缺点:传送速度较低。假设并行传送N位数据所需时间为T,那么串行传送的时间至少为N*T,实际上总是大于N*T。 接收设备发送设备 D2 D1 D0 D3 D7 D6 D5 D4

串口通信的接线方法

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

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)接口芯片种类越来越多,如下表所示。它们的基本功能是类似的,都能实现

DSP课程设计 同步串口通信在TMS320C643上实现

摘要 进入21世纪之后,数字化浪潮正在席卷全球,数字信号处理器DSP(Digital Signal Processor)正是这场数字化革命的核心,无论在其应用的广度还是深度方面,都在以前所未有的速度向前发展。数字信号处理是利用计算机或专用处理设备,以数字的形式对信号进行分析、采集、合成、变换、滤波、估算、压缩、识别等加工处理,以便提取有用的信息并进行有效的传输与应用。 DSP可以代表数字信号处理技术(Digital Signal Processing),也可以代表数字信号处理器(Digital Signal Processor)。前者是理论和计算方法上的技术,后者是指实现这些技术的通用或专用可编程微处理器芯片。 本文就是就是基于DSP原理及应用编写设计的同步串口通信在TMS320C643上实现。其集成开发环境为CCS,工作平台是SEED-DTK 。CCS 是TI公司推出的用于开发DSP芯片的集成开发环境,它采用Windows风格界面,集编辑、编译、链接、软件仿真、硬件调试以及实时跟踪等功能于一体,极大地方便了DSP芯片的开发与设计,是目前使用最为广泛的DSP开发软件之一。SEED-DTK(DSP Teaching Kit)是一套可以满足大学本科、研究生和教师科研工作的综合实验设备。SEED-DTK 是我公司在总结以往产品的基础上,以独特的多DSP 结构、强大的DSP 主板功能、丰富的外围实验电路、精心设计的实验程序、精湛的产品工艺形成的高性能产品。 关键字:同步串口通信 DSP CCS SEED-DTK

目录 一.功能描述 ---------------------------------------------------------- 3二.概要设计 ---------------------------------------------------------- 3 2.1 McBSP 介绍------------------------------------------------- 3 2.2 设计目的------------------------------------------------------ 4 2.3 设计概要------------------------------------------------------ 4三.详细设计 ---------------------------------------------------------- 4 3.1 实验程序功能与结构说明 -------------------------------- 4 3.2 程序流程图 ---------------------------------------------------- 5四.调试过程及效果 ------------------------------------------------- 5 4.1 实验准备------------------------------------------------------ 5 4.2 调试过程及效果 -------------------------------------------- 6 4.2.1 创建源文件 -------------------------------------------- 6 4.2.2 创建工程文件 ----------------------------------------- 7 4.2.2 设置编译与连接选项 -------------------------------- 8 4.2.3 工程编译与调试 ------------------------------------ 10 五.存在问题 -------------------------------------------------------- 12 六. 心得-------------------------------------------------------------- 12 七.参考文献 -------------------------------------------------------- 12 附录(源程序) ----------------------------------------------------- 13

通用串口通讯程序设计

通用串口通讯程序设计 作者:和光同尘版本: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)等等 只要保证帧头字节数据内容,在所有通讯数据字节流中,除帧头有意为之而出现,那就是帧头。建议最好有两个字节及以上,这样数据出现与帧头一致的概率更加小,才做到独一无二的特殊性。

串口通讯

串口通信的基本知识概念(232 422 485) 串口通信的基本概念: 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位。由于数据是在 传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现 了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同

串口通信的基本知识

串口通信的基本知识 串口通信的基本概念 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,那么对

GSK218M990MA串口通讯软件说明书

串口通讯软件说明书 串口通讯软件为Windows界面,用于PC端向CNC端发送文件、接收文件,或者进行DNC加工。该软件可运行于Win98、WinMe、WinXP及Win2K。 1 程序启动: 直接运行GSK Comm .exe程序。程序启动后界面如下: 2 功能介紹: 1.文件菜单 文件菜单里包括新建、打开和保存程序文件,打印和打印设置,最近打开的文件列 表等功能。 2.编辑菜单 编辑菜单包括剪切、复制、粘贴、撤消、查找、替换等功能。 3.串口菜单 主要是串口的打开和设置。 4.传输方式菜单 包括DNC传输方式、文件发送传输方式、文件接收传输方式。 5.查看菜单

工具栏和状态栏的显示和隐藏。 6.帮助菜单 本软件的版本信息。 3 软件使用: 1. DNC传输方式 注:需要将系统I/O通道设为0 1) 通过文件菜单的“打开”按钮或者工具栏的打开按钮打开程序文 件,有必要的话可以利用本软件再进一步编辑。 2) 打开并设置好串口,如上图所示,选择适用于GSK218M,系统默认的 DNC波特率是38400,可通过参数重新设置(具体参考218M系统操作 说明书)。218M系统设置为数据位8位,停止位0位,无奇偶校验。 3) 第一和第二步顺序可相互交换,不影响接下来的传输和加工;但接下去的 步骤必须按顺序操作,否则会影响传输和加工效果。 4) CNC端和机床准备好了之后,按下CNC面板上的按钮。 5) 打开传输方式菜单的“DNC”菜单项或者是按下工具栏的 DNC传输按钮,找到程序开始传送数据。 6) 当“发送字节”数停止时,按下CNC面板上的键接收数据,然后 再按下CNC面板上的按钮开始加工。 7) 接下去的可以正常加工的方式进行操作。 8)传输开始后,本程序会显示出传输的情况,包括传输的文件名,传输的字 节数,传输的行数,传输所用的时间和传输的速度(字节/秒);界面如下: 此时除结束传输之外,请不要对本软件进行其它的操作。加工完后按键

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.sodocs.net/doc/ef3357841.html,/Jolt/javacomm20-win32.zip。 ?如果是非Windows平台,请到Sun网站选择其他版本下载。地址如下: https://www.sodocs.net/doc/ef3357841.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.sodocs.net/doc/ef3357841.html,m.properties拷贝到{JAVA_HOME}\jre\lib ?set CLASSPATH={JAVA_HOME}\jre \lib\ext \comm.jar;%classpath%

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

单片微机原理及应用 徐春辉第10章 习题答案51系列单片机的串行通信习题与思考题答案讲课讲稿

单片微机原理及应用徐春辉第10章习题答案51系列单片机的串行通信习题与思考题答案

练习与思考题10 1.串行数据传送的主要优点和作用是什么? 答:串行数据传送的主要优点是硬件接口简单,接口端口少(2个)。主要用于微机之间或微机与外设之间的数据通信。 2.单工、半双工、全双工通信有什么异同? 答:相同之处在于都是串行通信; 单工方式:数据仅按一个固定方向传送。 半双工方式:数据可实现双向传送,但不能同时进行。 全双工方式:允许通信双方同时进行数据双向传送。。 3.假定串行口串行发送的字符格式为1个起始位,8个数据位,1个奇校验 位,1个停止位,请画出传送字符“F”的帧格式。 起始位0 1 1 0 0 0 1 0 校验位0 停止位 4.若异步通信接口按方式3传送,已知其每分钟传送3600个字符,其波特率 是多少? 答:已知每分钟传送3600个字符,方式3每个字符11位,则: 波特率=(11b/字符)×(3600字符/60s)=660b/s 5.AT89S51单片机的串行口由哪些功能部件组成?各有什么作用?

答:AT89S51单片机的串行接口由发送缓冲器SBUF,接收缓冲器SBUF、输入移位寄存器、串行接口控制器SCON、定时器T1构成的波特率发生器等部件组成。 由发送缓冲期SBUF发送数据,接收缓冲期SBUF接收数据。串行接口通信的工作方式选择、接收和发送控制及状态等均由串行接口控制寄存器SCON控制和指示。定时器T1产生串行通信所需的波特率。 6.AT89S51单片机串行口有几种工作方式?有几种帧格式?各种工作方式的波 特率如何确定? 答:串行口有4种工作方式:方式0、方式1、方式2、方式3; 有3种帧格式,方式2和3具有相同的帧格式; 方式0的发送和接收都以fosc/12为固定波特率, 方式1的波特率=2SMOD/32×定时器T1的溢出率 方式2的波特率=2SMOD/64×fosc 方式3的波特率=2SMOD/32×定时器T1的溢出率 7.为什么MCS-51串行口的方式0帧格式没有起始位(0)和停止位(1)? 解答:串行口的方式0为同步移位寄存器输入输出方式,常用于外接移位寄存器,以扩展并行I/O口,一般不用于两个MCS-51之间的串行通信。该方式以fosc/12的固定波特率从低为位到高位发送或接受数据。 8.AT89S51中SCON的SM2,TB8,RB8有何作用? 答:AT89S51中SCON的SM2是多机通信控制位,主要用于方式2和方式 3.若置SM2=1,则允许多机通信。

常用通讯测试工具使用

常用通讯测试工具 鉴于很多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.设串行异步通信的数据格式是:1个起始位,7个数据位,1个校验位,1个停止位,若传输率为1200,则每秒钟传输的最大字符数为( C)。 (A)10个(B)110个(C)120个(D)240个 2.在数据传输率相同的情况下,同步字符传输的速度要高于异步字符传输,其原因是(D )。(A)字符间无间隔(B)双方通信同步 (C)发生错误的概率少(D)附加的辅助信息总量少 3.异步串行通信中,收发双方必须保持(C )。 (A)收发时钟相同(B)停止位相同 (C)数据格式和波特率相同(D.以上都正确 4.在数据传输率相同的情况下,同步传输率高于异步传输速率的原因是(A )。 (A)附加的冗余信息量少(B)发生错误的概率小 (C)字符或组成传送,间隔少(D)由于采用CRC循环码校验 5.用REPE SCASB指令对字符串进行扫描,如CX= 0时,扫描结束,那么表示(D)。(A)在字符串中遇上第一个AL中指定的字符 (B)在字符串中有一个AL中指定的字符 (C)在字符串中有一个不是AL中指定的字符 (D)在字符串中遇上第一个不是AL中指令的字符 6.intel公司生产的用于数据串行传送的可编程接口芯片是(D)。 (A)8259 (B)8237 (C)8255 (D)8251 7.在异步通信方式中,通常采用(B )来校验错误。 (A)循环冗余校验码(B)奇、偶校验码

(C)海明校验码(D)多种校验方式的组合 8.intel 8251A的TxD、RxD引脚的信号电平符合(B)。 (A)DTL标准(B)TTL标准(C)HTL标准(D)RS-232C标准 9.8251的方式字(模式字)的作用是( C )。 (A)决定8251的通信方式(B)决定8251的数据传送方向 (C)决定8251的通信方式和数据格式(D)以上三种都不对 10.异步传送中,CPU了解8251A是否接收好一个字符数据的方法是(D )。 (A)CPU响应8251A的中断请求 (B)CPU通过查询请求信号RTS (C)CPU通过程序查询RxD接收线状态 (D)CPU通过程序查询RxRDY信号状态 11.传送ASCII码时D7位为校验位,若采用偶校验,传送字符4的ASCII码34H时的编码为(A)。 (A)B4H (B)34H (C)35H (D)B5H 12.异步串行通信的主要特点是( B )。 (A) 通信双方不需要同步(B) 传送的每个字符是独立发送的 (C) 字符之间的间隔时间应相同(D) 传送的数据中不含有控制信息 13.在异步串行通信中,使用波特率来表示数据的传送速率,它是指(D)。 (A) 每秒钟传送的字符数(B) 每秒钟传送的字节数 (C) 每秒钟传送的字数(D) 每秒钟传送的二进制位数 14.串行通信中,若收发双方的动作由同一个时钟信号控制,则称为(A)串行通信。 (A)同步(B)异步(C)全双工(D)半双工

相关主题