这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 串口通讯问题

共8条 1/1 1 跳转至

串口通讯问题

菜鸟
2004-12-02 17:17:25     打赏

各位高手:现小弟遇到一问题望各位指教。我想通过串口达到自发自收;我把程序download入目标机后,检查recvBuf 始终没有东西,为方便各位看现将sendBuf的内容改为a。程序如下:

#include "vxworks.h" #include "ioLib.h" #include "semLib.h" #include "D:\Tornado\target\h\ARCH\I86\ivI86.h"

#define bufSize 10 #define taskStack 20000

void comInterruptSvcRout(void); void comSendTask(void); void displayTask(void);

SEM_ID syncSem; int fd; char sendBuf[bufSize]="a"; char recvBuf[20]; int i = 0;

init() { intConnect(INUM_TO_IVEC(0x04),comInterruptSvcRout,0); syncSem = semBCreate(SEM_Q_FIFO,SEM_EMPTY); taskSpawn("comSend",200,0,taskStack,comSendTask,0,0,0,0,0,0,0,0,0,0); taskSpawn("display",220,0,taskStack,displayTask,0,0,0,0,0,0,0,0,0,0); fd = open("/tyCo/0",O_RDWR,0); ioctl(fd,FIOBAUDRATE,38400); /*ioctl(fd,OPT_LINE,1);*/ } void comSendTask(void)

{ while(1) { write(fd,sendBuf,bufSize); taskDelay(100); } }

void comInterruptSvcRout(void) { semGive(syncSem); }

void displayTask(void) { while(1) { semTake(syncSem,WAIT_FOREVER); read(fd,recvBuf,sizeof(recvBuf)); printf("%s\n",recvBuf); } } 各位请赐教有急用!!!!!




关键词: 串口     通讯     问题    

菜鸟
2004-12-02 17:40:00     打赏
2楼

非常可能的是,你的ISR挂接不正确。

不妨在comInterruptSvcRout中添加logMsg,看看是否进入中断服务程序。


菜鸟
2004-12-08 00:06:00     打赏
3楼

我是通过网络与目标机连接的,现在是想通过串口达到自发自收的目的,和串口驱动程序没关系。

斑竹,请问logMsg 在什么地方查看?我觉得我的中断程序就没有 起作用,shell下的recvBuf中就没有数据。请快回复。。。。。。!!!~~~~

[em01]

菜鸟
2004-12-08 19:19:00     打赏
4楼

噢 是这样.我看过一些文章觉得ioctl()函数好像有许多的问题,但总找不到是为什么,听你这么一说明白了很多.但我的串口驱动应该怎么修改啊?请赐教.....

另外,我如果直接对MCU的寄存器进行编程,应该怎么写能不能指教一下..多谢!!!!!!.......

[em07]

菜鸟
2004-12-08 19:26:00     打赏
5楼

~~~~~~~~~~~~请问斑竹这种情况下如何挂节ISR,串口的中断为0x04

intConnect(INUM_TO_IVEC(0x04),comInterruptSvcRout,0);这样对吗?

为什么有人说成是intConnect(INUM_TO_IVEC(0x24),comInterruptSvcRout,0);啊

他认为x86系列的cpu的中断偏移量是0x20;所以要写成0x24 这样对吗?

!!!!!!!!

[em07]

菜鸟
2004-12-10 18:11:00     打赏
6楼

各位高手:

你们用串口通信的时候,是用ioctl()还是向串口寄存器里写东西啊?还有中断偏移量加不加?


菜鸟
2004-12-17 16:51:00     打赏
7楼

这时我作的!你可以参考一下!

if ( OK == FileRead( FileName ) ) printf( "\nFile Readed Successed!\n" ); else printf( "\nFile Readed Failed!\n" );

SerialDevFd = open( "/tyCo/0", O_RDWR, 0 ); // 打开串口设备

if ( ERROR == SerialDevFd ) printf( "\nOpen tyCo/0 Failed!\n" ); else printf( "\nOpen tyCo/0 Successed!\n" );

/* change baud-rate */ ioctl( SerialDevFd, FIOBAUDRATE, 9600 ); /* set to 'raw' mode */ ioctl( SerialDevFd, FIOSETOPTIONS, OPT_TERMINAL & OPT_RAW ); /* set to data bits*/ // ioctl( SerialDevFd, SIO_HW_OPTS_SET, 8 );

/* create the reader & the writer tasks */ taskId = taskSpawn("SerialTask", 120, 0, 2 * 1024, (FUNCPTR)SerialTask, SerialDevFd,0,0,0,0,0,0,0,0,0);

#include "VxWorks.h" #include "ioLib.h" #include "stdio.h" #include "sioLib.h"

#define COMMANDBEGIN 0x01 #define COMMANDEND 0x1C #define MAX_RECEIVE_LENGTH 1024

#define WORD(HighByte,LowByte) ((LowByte<<8)+HighByte)

//////////////////////////////////////////////////////////////////////////// // // 接收命令格式:命令头(7个字节) + 数据(DataLength-1个字节) + 数据校验码 // 注:若只有命令头无数据(DataLength == 0)时,则只接收7个字节 // // 命令头格式: // // 命令头(2个字节):0xAA 0x55 // 命令号(1个字节):0x01 // 数据长度(2个字节):低字节在前,高字节在后:DataLength = ( ReceiveBuf[4] << 8 ) + ReceiveBuf[3]; // 校验码(1个字节):采用和校验:checksum = ReceiveBuf[0] + ReceiveBuf[1] + ReceiveBuf[2] + // ReceiveBuf[3] + ReceiveBuf[4]; // 命令头结束符(1个字节):0x00 // // 数据校验码:采用和校验:checksum = buf[0] + buf[1] + ... + buf[DataLength - 1] // // 发送命令格式:命令头(7个字节) + 数据(DataLength-1个字节) + 数据校验码 // // 命令头格式: // // 命令头(2个字节):0x55 0xAA // 命令号(1个字节):0x01 // 数据长度(2个字节):低字节在前,高字节在后:DataLength = ( ReceiveBuf[4] << 8 ) + ReceiveBuf[3]; // 校验码(1个字节):采用和校验:checkSum = SendBuf[0] + SendBuf[1] + SendBuf[2] + SendBuf[3] + SendBuf[4]; // 命令头结束符(1个字节):0x00 // // 数据校验码:采用和校验:checksum = buf[0] + buf[1] + ... + buf[DataLength - 1] ////////////////////////////////////////////////////////////////////////////

unsigned char SendCommandHead[][7] = // 命令头格式 { // 命令头 + 命令号+数据长度 + 校验和 + 结束码 { 0x55, 0xAA, 0x01, 0x00, 0x00, 0x00, 0x00 }, // { 0x55, 0xAA, 0x02, 0x00, 0x00, 0x01, 0x00 }, // { 0x55, 0xAA, 0x03, 0x00, 0x00, 0x02, 0x00 }, // { 0x55, 0xAA, 0x04, 0x00, 0x00, 0x03, 0x00 }, // { 0x55, 0xAA, 0x05, 0x00, 0x00, 0x04, 0x00 }, // { 0x55, 0xAA, 0x06, 0x00, 0x00, 0x05, 0x00 }, // { 0x55, 0xAA, 0x07, 0x00, 0x00, 0x06, 0x00 }, // { 0x55, 0xAA, 0x08, 0x00, 0x00, 0x07, 0x00 }, // { 0x55, 0xAA, 0x09, 0x00, 0x00, 0x08, 0x00 }, // { 0x55, 0xAA, 0x0A, 0x00, 0x00, 0x09, 0x00 }, // { 0x55, 0xAA, 0x0B, 0x00, 0x00, 0x0A, 0x00 }, // { 0x55, 0xAA, 0x0C, 0x00, 0x00, 0x0B, 0x00 }, // { 0x55, 0xAA, 0x0D, 0x00, 0x00, 0x0C, 0x00 }, // { 0x55, 0xAA, 0x0E, 0x00, 0x00, 0x0D, 0x00 }, // { 0x55, 0xAA, 0x0F, 0x00, 0x00, 0x0E, 0x00 }, // { 0x55, 0xAA, 0x10, 0x00, 0x00, 0x0F, 0x00 }, // { 0x55, 0xAA, 0x11, 0x00, 0x00, 0x10, 0x00 }, // { 0x55, 0xAA, 0x12, 0x00, 0x00, 0x11, 0x00 }, // { 0x55, 0xAA, 0x13, 0x00, 0x00, 0x12, 0x00 }, // { 0x55, 0xAA, 0x14, 0x00, 0x00, 0x13, 0x00 }, // { 0x55, 0xAA, 0x15, 0x00, 0x00, 0x14, 0x00 }, // { 0x55, 0xAA, 0x16, 0x00, 0x00, 0x15, 0x00 }, // { 0x55, 0xAA, 0x17, 0x00, 0x00, 0x16, 0x00 }, // { 0x55, 0xAA, 0x18, 0x00, 0x00, 0x17, 0x00 }, // { 0x55, 0xAA, 0x19, 0x00, 0x00, 0x18, 0x00 }, // { 0x55, 0xAA, 0x1A, 0x00, 0x00, 0x19, 0x00 }, // { 0x55, 0xAA, 0x1B, 0x00, 0x00, 0x1A, 0x00 }, // { 0x55, 0xAA, 0x1C, 0x00, 0x00, 0x1B, 0x00 } // };

////////////////////////////////////////////////////////////////////// // // checkSum:对接收数据的前8个进行校验,采用和校验。 // // buffer:接收数据的起始地址。 // //////////////////////////////////////////////////////////////////////

unsigned char Checksum( unsigned char *buffer, int Bengin, int End ) { unsigned char sum = 0; int i;

for ( i = Bengin; i < End + 1; i++ ) sum += *( buffer + Bengin + i ); return sum; }

////////////////////////////////////////////////////////////////////// // // SerialTask:对接收与发送的线程SerialTask。 // // SerialDevFd:串口描述符。 // //////////////////////////////////////////////////////////////////////

void SerialTask( int SerialDevFd ) { struct fd_set readFds; /* bit mask of fds to read from */ int width; /* number of fds on which to pend */ unsigned char ReceiveBuf[MAX_RECEIVE_LENGTH]; unsigned int DataLength; unsigned int ReciveLength = 0; int i = 0; /* loop forever reading data and servicing clients */ FOREVER { /* clear bits in read bit mask */ FD_ZERO( &readFds ); // 清除文件描述符集中对应SerialDevFd的位 /* initialize bit mask */ FD_SET( SerialDevFd, &readFds ); // 设置文件描述符集中对应SerialDevFd的位 width = SerialDevFd + 1; // 文件描述符集有效部分大小 /* pend, waiting for one or more fds to become ready */ if ( ERROR == select( width, &readFds, NULL, NULL, NULL ) ) // 1、文件描述符集有效部分大小 2、读文件描述符集 3、写文件描述符集 4、VxWorks未支持 5、最大等待时间 { printf( "ERROR!\n" ); } // check if this fd has data to read if ( FD_ISSET( SerialDevFd, &readFds ) ) // 如果文件描述符集中对于SerialDevFd的位置位,结果为TRUE,否则为FALSE { ReciveLength = 0; FOREVER { // typically read from fd now that it is ready if ( ERROR == ( read( SerialDevFd, ReceiveBuf + ReciveLength, 1 ) ) ) // 接收一个字符 { printf( "ERROR Reading\n" ); } else { ReciveLength++; // 接收字符长度加1 if ( ( 1 == ReciveLength ) && ( 0xAA != ReceiveBuf[0] ) ) // 对接收的第1个字符校验 { printf( "Error:Invalid Synchronization Yard One!\n" ); ReciveLength = 0; bzero( ReceiveBuf, sizeof( ReceiveBuf ) ); } else if ( ( 2 == ReciveLength ) && ( 0x55 != ReceiveBuf[1] ) ) // 对接收的第2个字符校验 { printf( "Error:Invalid Synchronization Yard Two!\n" ); ReciveLength = 0; bzero( ReceiveBuf, sizeof( ReceiveBuf ) ); } else if ( ( 3 == ReciveLength ) && ( ( COMMANDBEGIN > ReceiveBuf[2] ) || ( COMMANDEND < ReceiveBuf[2] ) ) ) // 对接收的第3个字符校验 { printf( "Error:Invalid Command!\n" ); ReciveLength = 0; bzero( ReceiveBuf, sizeof( ReceiveBuf ) ); } else if ( ( 6 == ReciveLength ) && ( Checksum( ReceiveBuf, 0, 4 ) != ReceiveBuf[5] ) ) { printf( "Error:Command Head Checksum Failed!\n" ); ReciveLength = 0; bzero( ReceiveBuf, sizeof( ReceiveBuf ) ); } else if ( 7 == ReciveLength ) { if ( 0x00 == ReceiveBuf[6] ) { // DataLength = ( ReceiveBuf[4] << 8 ) + ReceiveBuf[3]; DataLength = WORD( ReceiveBuf[3], ReceiveBuf[4] ); if ( 0 == DataLength ) { printf( "Length:%d Data:", ReciveLength ); for ( i = 0; i < ReciveLength; i++ ) { printf( "%x ", ReceiveBuf ); } printf( "\n" ); write( SerialDevFd, SendCommandHead[ReceiveBuf[2] - 1], 7 ); // 发送命令头 // 根据命令号SendCommandHead[ReceiveBuf[3]]发送数据 // write( SerialDevFd, SendCommandHead[ReceiveBuf[3]], 8 ); ReciveLength = 0; bzero( ReceiveBuf, sizeof( ReceiveBuf ) ); } } else { printf( "Error:Command End!\n" ); ReciveLength = 0; bzero( ReceiveBuf, sizeof( ReceiveBuf ) ); } } else if ( 8 <= ReciveLength ) { DataLength--; if ( 0 == DataLength ) // 数据接收完成 { if ( Checksum( ReceiveBuf, 7, DataLength - 1 ) != ReceiveBuf[DataLength - 1] ) { printf( "Error:Data Checksum!\n" ); ReciveLength = 0; bzero( ReceiveBuf, sizeof( ReceiveBuf ) ); } else { printf( "Length:%d Data:", ReciveLength ); for ( i = 0; i < ReciveLength; i++ ) { printf( "%x ", ReceiveBuf ); } printf( "\n" ); // 校验接收的命令号 write( SerialDevFd, SendCommandHead[ReceiveBuf[2] - 1], 7 ); // 发送命令头 // 根据命令号SendCommandHead[ReceiveBuf[3]]发送数据 // write( SerialDevFd, SendCommandHead[ReceiveBuf[3]], 8 ); // 对接收缓冲区清空 ReciveLength = 0; bzero( ReceiveBuf, sizeof( ReceiveBuf ) ); } } } // normally service request, for this example print it /* if ( 0 == Length ) { break; } */ } } // End FOREVER } // End FD_ISSET } // End FOREVER }


菜鸟
2004-12-20 17:24:00     打赏
8楼
谢谢上面各位兄弟的指点,,小弟在此一并谢过了!!![em07]

共8条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]