串口接收数据出错问题

zhongaiying 2009-06-29 03:00:33
unsigned char recflag = 0;
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.怎么我第二次开始接收数据全乱了?
...全文
350 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhongaiying 2009-07-01
  • 打赏
  • 举报
回复
还是没搞定.谁有stc12的.调试过了的.我这的总是丢数据搞不清楚原因了.
Candy_Gong 2009-07-01
  • 打赏
  • 举报
回复
串口发送数据的时候是一个bit一个bit的发送的,接收的时候也是(串口接收中有一个位移寄存器,接收一次左移一位)!你如果想接收一字节数据,rsv_buffer[7]中的才是你真正想得到的。如果你想接收一字节以上的数据的话,得用另一个变量来存放数据了。然后把它们合起来就得要你想要的东西了。
米格315 2009-06-30
  • 打赏
  • 举报
回复
Nio96 2009-06-30
  • 打赏
  • 举报
回复
你把代码贴全一点吧,这样很难看出来。

这是我在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;
}
}
zhongaiying 2009-06-29
  • 打赏
  • 举报
回复
fuzzy_man 怎样处理校验位?
zhongaiying 2009-06-29
  • 打赏
  • 举报
回复
对了.波特率换成9600还没有八位数据了.才有四位对了.
fuzzy_man 2009-06-29
  • 打赏
  • 举报
回复
你利用串口调试工具查一下串口数据对不? 另外程序中只看到了开始位(0xfd),也没有没处理校验位等。
zhongaiying 2009-06-29
  • 打赏
  • 举报
回复
发送一点问题都没有.波特率应该没问题我试过2400还有1200都一样.
zhongaiying 2009-06-29
  • 打赏
  • 举报
回复
怎么清?S2CON = S2CON & 0xFE; //1111,1110
不是这样嘛?
Nio96 2009-06-29
  • 打赏
  • 举报
回复
波特率太小么
mengjfu 2009-06-29
  • 打赏
  • 举报
回复
接收后,清空缓冲区试试

69,374

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧