idata unsigned char rsv_buffer[20];
void UART_Receive(void) interrupt 8
{
u16 k = 0;
//receive_count = 0;
k = S2CON ;
k = k & 0x01;
if(k==1)
{
S2CON = S2CON & 0xFE; //1111,1110
if(recflag == 8)recflag = 0;
rsv_buffer[recflag]=S2BUF;
recflag++;
}
else
{
//TI = 0;
S2CON = S2CON&0xfd;
//receive_count = 0;
}
string_to_OSD(11,5,rsv_buffer);
}
1.怎么我接收到的数据第一次时八个以下字符正常.多于八个的出错?
2.怎么我第二次开始接收数据全乱了?
11 个解决方案
#1
接收后,清空缓冲区试试
#2
波特率太小么
#3
怎么清?S2CON = S2CON & 0xFE; //1111,1110
不是这样嘛?
不是这样嘛?
#4
发送一点问题都没有.波特率应该没问题我试过2400还有1200都一样.
#5
你利用串口调试工具查一下串口数据对不? 另外程序中只看到了开始位(0xfd),也没有没处理校验位等。
#6
对了.波特率换成9600还没有八位数据了.才有四位对了.
#7
fuzzy_man 怎样处理校验位?
#8
你把代码贴全一点吧,这样很难看出来。
这是我在linux下写的一个串口接收程序,你参考一下,其实串口程序主要就是设置一些参数项,你设对了一般就可以了,具体的参数含义可以查一下资料。
...
这是我在linux下写的一个串口接收程序,你参考一下,其实串口程序主要就是设置一些参数项,你设对了一般就可以了,具体的参数含义可以查一下资料。
...
do{
state->fd = open(device,O_RDWR);
}while(state->fd<0 && errno == EINTR);
if(isatty(state->fd))
{
struct termios ios;
if(0!=tcgetattr(state->fd,,&ios))
{
perror("get ttyS1");
goto Fail;
}
cfsetispeed(&ios,B115200);
ios.c_cflag |= (CLOCAL | CREAD);
ios.c_lfag &= ~(ICANON | ECHO | ECHOE | ISIG);
ios.c_oflag &= ~OPOST;
ios.c_cc[VMIN] = 0;
ios.c_cc[VTIME] = 100;
if(0!=tcsetattr(state->fd,TCSANOW,&ios))
{
perror("setup ttyS1");
goto Fail;
}
}
#9
顶
#10
还是没搞定.谁有stc12的.调试过了的.我这的总是丢数据搞不清楚原因了.
#11
串口发送数据的时候是一个bit一个bit的发送的,接收的时候也是(串口接收中有一个位移寄存器,接收一次左移一位)!你如果想接收一字节数据,rsv_buffer[7]中的才是你真正想得到的。如果你想接收一字节以上的数据的话,得用另一个变量来存放数据了。然后把它们合起来就得要你想要的东西了。
#1
接收后,清空缓冲区试试
#2
波特率太小么
#3
怎么清?S2CON = S2CON & 0xFE; //1111,1110
不是这样嘛?
不是这样嘛?
#4
发送一点问题都没有.波特率应该没问题我试过2400还有1200都一样.
#5
你利用串口调试工具查一下串口数据对不? 另外程序中只看到了开始位(0xfd),也没有没处理校验位等。
#6
对了.波特率换成9600还没有八位数据了.才有四位对了.
#7
fuzzy_man 怎样处理校验位?
#8
你把代码贴全一点吧,这样很难看出来。
这是我在linux下写的一个串口接收程序,你参考一下,其实串口程序主要就是设置一些参数项,你设对了一般就可以了,具体的参数含义可以查一下资料。
...
这是我在linux下写的一个串口接收程序,你参考一下,其实串口程序主要就是设置一些参数项,你设对了一般就可以了,具体的参数含义可以查一下资料。
...
do{
state->fd = open(device,O_RDWR);
}while(state->fd<0 && errno == EINTR);
if(isatty(state->fd))
{
struct termios ios;
if(0!=tcgetattr(state->fd,,&ios))
{
perror("get ttyS1");
goto Fail;
}
cfsetispeed(&ios,B115200);
ios.c_cflag |= (CLOCAL | CREAD);
ios.c_lfag &= ~(ICANON | ECHO | ECHOE | ISIG);
ios.c_oflag &= ~OPOST;
ios.c_cc[VMIN] = 0;
ios.c_cc[VTIME] = 100;
if(0!=tcsetattr(state->fd,TCSANOW,&ios))
{
perror("setup ttyS1");
goto Fail;
}
}
#9
顶
#10
还是没搞定.谁有stc12的.调试过了的.我这的总是丢数据搞不清楚原因了.
#11
串口发送数据的时候是一个bit一个bit的发送的,接收的时候也是(串口接收中有一个位移寄存器,接收一次左移一位)!你如果想接收一字节数据,rsv_buffer[7]中的才是你真正想得到的。如果你想接收一字节以上的数据的话,得用另一个变量来存放数据了。然后把它们合起来就得要你想要的东西了。