dsp和pc通信,串口丢数据问题

wyly 2004-08-10 03:39:39
我用pc串口和dsp通信
dsp自己收发环回没问题的。

dsp收,pc发也没问题

dsp发,pc收就会丢少量的数据。

我开始怀疑是rts流控制没做好,用示波器抓数据,没发现rts信号激活,就是说没有流控的问题,所以很奇怪。

pc我用同步阻塞模式,设置如下,哪位大侠帮我看看:

GetCommState(hCom, &dcb ) ; //读串口原来的参数设置
dcb.BaudRate = 115200;
dcb.ByteSize =8;
dcb.Parity = NOPARITY;
dcb.StopBits = ONESTOPBIT ;
dcb.fBinary = TRUE ;
dcb.fParity = FALSE;
dcb.fRtsControl = RTS_CONTROL_HANDSHAKE; // 流控制打开
...全文
223 点赞 收藏 20
写回复
20 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
wyly 2004-08-13
呵呵,我顶。
有什么问题你说嘛
回复
AthlonxpX86 2004-08-13
回复人: AthlonxpX86(桃源村) ( ) 信誉:143 2004-08-12 19:11:00 得分: 0
丢失数据根本与你的这段代码无关,尽管你的这段代码有很严重的问题,但问题应该在DSP或者你的别的程序,肯定与串口发送接收无关(我用PC在98下试验了,没有任何数据丢失)


回复
AthlonxpX86 2004-08-12
丢失数据根本与你的这段代码无关,尽管你的这段代码有很严重的问题,问题应该在DSP或者你的别的程序,肯定与串口发送接收无关(我用PC在98下试验了,没有任何数据丢失)
回复
AthlonxpX86 2004-08-12
我晕死,看了你的程序,你的程序要不出问题,我跳楼自杀
回复
wyly 2004-08-12
我顶
回复
wyly 2004-08-11
不是波特率的问题,无论什么波特率都丢0xd,0xa这两个字符。
应该是打开文件的设置问题,能不能设成非字符方式??
回复
zhangnanonnet 2004-08-11
你把波特率调小点试试。
回复
wyly 2004-08-11
unsigned int ReadUart(byte* buf)
{
unsigned long len;

ReadFile(hCom, buf, 1024, &len, NULL);

return len;
}
回复
basboy 2004-08-11
请贴上你用来接收数据的程序段
回复
wyly 2004-08-11
原来丢的都是0x0d, 0x0a,回车换行
哈哈哈,我代码如下,怎么解决这个问题


hCom = CreateFile("COM2",GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
//FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
FILE_ATTRIBUTE_NORMAL,
NULL);

if(hCom == INVALID_HANDLE_VALUE)
return 0;

SetupComm( hCom, 4096, 4096 ) ;
PurgeComm( hCom, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR ) ;

COMMTIMEOUTS CommTimeOuts ;
CommTimeOuts.ReadIntervalTimeout = 0xFFFFFFFF ;
CommTimeOuts.ReadTotalTimeoutMultiplier = 0;
CommTimeOuts.ReadTotalTimeoutConstant = 1000; // 读取数据延时的时间
CommTimeOuts.WriteTotalTimeoutMultiplier = 0;
CommTimeOuts.WriteTotalTimeoutConstant = 1000 ;

SetCommTimeouts( hCom, &CommTimeOuts ) ;//设置读写操作所允许的超时

DCB dcb ;
GetCommState(hCom, &dcb ) ; //读串口原来的参数设置
dcb.BaudRate = 115200;
dcb.ByteSize =8;
dcb.Parity = NOPARITY;
dcb.StopBits = ONESTOPBIT ;
dcb.fBinary = TRUE ;
dcb.fParity = FALSE;
dcb.fRtsControl = RTS_CONTROL_HANDSHAKE;
SetCommState(hCom, &dcb ) ;
回复
AthlonxpX86 2004-08-11
邮箱yds_086@163.com
回复
AthlonxpX86 2004-08-11
不是这部分代码!这和串口接受部分无关,应该是你的数据处理方面的问题,如果没有利益问题,可以发我邮箱,来给你调试。
你的程序肯定会出现问题

unsigned int ReadUart(byte* buf)
没有串口通知你你怎么知道什么时候接受,而且一接受就是1024,这根本不符合串口编程思想,肯定会产生问题
回复
wyly 2004-08-11
设置串口
huahCom = CreateFile("COM2",GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
//FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
FILE_ATTRIBUTE_NORMAL,
NULL);

if(hCom == INVALID_HANDLE_VALUE)
return 0;

SetupComm( hCom, 4096, 4096 ) ;
PurgeComm( hCom, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR ) ;

COMMTIMEOUTS CommTimeOuts ;
CommTimeOuts.ReadIntervalTimeout = 0xFFFFFFFF ;
CommTimeOuts.ReadTotalTimeoutMultiplier = 0;
CommTimeOuts.ReadTotalTimeoutConstant = 1000; // 读取数据延时的时间
CommTimeOuts.WriteTotalTimeoutMultiplier = 0;
CommTimeOuts.WriteTotalTimeoutConstant = 1000 ;

SetCommTimeouts( hCom, &CommTimeOuts ) ;//设置读写操作所允许的超时

DCB dcb ;
GetCommState(hCom, &dcb ) ; //读串口原来的参数设置
dcb.BaudRate = 115200;
dcb.ByteSize =8;
dcb.Parity = NOPARITY;
dcb.StopBits = ONESTOPBIT ;
dcb.fBinary = TRUE ;
dcb.fParity = FALSE;
dcb.fRtsControl = RTS_CONTROL_HANDSHAKE;
SetCommState(hCom, &dcb ) ;

读取串口
unsigned int ReadUart(byte* buf)
{
unsigned long len;

ReadFile(hCom, buf, 1024, &len, NULL);

return len;
}
回复
AthlonxpX86 2004-08-11
贴出你的代码我给你改
回复
wyly 2004-08-11
怎么设置打开文件到非字符方式?
回复
AthlonxpX86 2004-08-11
读文件
Createfile
Readfile
回复
yxlab 2004-08-10
串口的速度反应不够快。时序要同步好。
回复
oyljerry 2004-08-10
是不是串口接收的时候有数据丢失呢?
回复
AthlonxpX86 2004-08-10
我怀疑是软件问题,在Nt/2000下阻塞方式的串口程序很容易使程序死掉,你看看丢失的数据在大概都出现在什么地方
115200有点高
dcb.Parity = NOPARITY;无效验?我想这是最大的问题之一,连续的大数据量的传输,无效验怎么能行??
回复
phant 2004-08-10
我给你一个好用的类http://www.codeproject.com/system/serial.asp,这比MSCOMM好用的多,而且支持MFC。支持消息映射。
回复
相关推荐
发帖
硬件/系统
创建于2007-09-28

2598

社区成员

VC/MFC 硬件/系统
申请成为版主
帖子事件
创建了帖子
2004-08-10 03:39
社区公告
暂无公告