串口传输文件,接收不全

tracyjk 2011-06-10 04:52:08
用usb模拟串口来通信
在arm板上写了个接收发送的程序,利用sscom32.exe和串口调试软件.exe来调试
收发字符串什么的都可以正常收发,但在传输文件的时候出了点岔子。
如果传输的文件比较小就几十K的话可以完整的接收到arm板子上
但是传输的文件超过了200K的话只能直接100多K的内容,后面的内容就变成乱码了。接收到arm板子上的文件大小也就100多K

设置的波特率为9600的

现在不能确定是我arm板上的程序的问题还是PC上那2个调试工具的问题
请教下各位,有没有谁用sscom32.exe和串口调试软件.exe这2个工具成功的传输过超过200K的文件的
...全文
467 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
usa2003wangliang 2011-06-20
  • 打赏
  • 举报
回复
不懂 呵呵
jldream110 2011-06-13
  • 打赏
  • 举报
回复
你用的usb转串口? 用usb模拟串口来通信?
  • 打赏
  • 举报
回复
sscom32.exe和串口调试软件.exe, 100%是工具的问题, 推荐一个, 楼主试试看 AccessPort
a1966375040 2011-06-13
  • 打赏
  • 举报
回复
其实稍为收一个也是不错的
lbing7 2011-06-13
  • 打赏
  • 举报
回复
不知道是不是缓冲的问题

tracyjk 2011-06-13
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 hahahaha_hax4 的回复:]
If you are trying to transfer binary file through UART, you can use protocols like x modem (or y modem, z modem ), which does a better job to handle all the exceptions.
[/Quote]
我上网没找到x/y/z modem的源码或例子,能否提供下
谢谢
894870590@qq.com
tracyjk 2011-06-13
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 schlafenhamster 的回复:]
降低波特率试试。
文件太大与缓存有关。
缓存开大些试试。
加流控制试试(XON,XOFF)
串口传输的文件时,是字节流,不分格式。
不过二进制比文本(ASCII)要小
[/Quote]
缓存开大了些,传输文件的大小增加了点,但要是文件要是打到1M的话就又出现之前的问题了
以下是我串口的设置

//9600,8数据位,无校验位,1停止位--9600,8,1,'n'
static Set_Port(int fd)
{
int baudrate;
struct termios newtio;
//波特率
baudrate=B9600;

tcgetattr(fd,&newtio);
bzero(&newtio,sizeof(newtio));
//setting c_cflag
newtio.c_cflag &=~CSIZE;

//设置数据位--8位
newtio.c_cflag |= CS8;

//设置校验--无校验位
newtio.c_cflag &= ~PARENB; /* Clear parity enable */
newtio.c_iflag &= ~INPCK; /* Enable parity checking */

//停止位--1
newtio.c_cflag &= ~CSTOPB;

newtio.c_cc[VTIME] = 0;
newtio.c_cc[VMIN] = 0;
newtio.c_cflag |= (CLOCAL|CREAD);
//newtio.c_oflag|=OPOST;
////输出模式:原始数据输出
newtio.c_oflag &= ~(OPOST);

newtio.c_iflag &=~(IXON|IXOFF|IXANY);
cfsetispeed(&newtio,baudrate);
cfsetospeed(&newtio,baudrate);
tcflush(fd, TCIFLUSH);

//配置立即生效
if (tcsetattr(fd,TCSANOW,&newtio) != 0){
perror("SetupSerial 3");
return -1;
}
return 0;

}

rayforeverster 2011-06-13
  • 打赏
  • 举报
回复
感觉不是串口的问题吧。。你是收到的数据直接存在缓存中,还是写入文件的啊。。。尽量还是用xmodem协议吧
skylkj 2011-06-13
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 tracyjk 的回复:]
分块我的理解是把一个文件压缩成几个比较小的文件分别传送
不知道还有没有其他的方式,比如不压缩也能分块传输...[/Quote]

切分下就可以了啊,不用压缩。 等于原来1m的文件,切成100个10k的块来传
tracyjk 2011-06-13
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 skylkj 的回复:]
文件分块发送,一般用串口都不回一次性传太大的文件的

数据收不全应该是下位机缓存的问题,如果硬件上用的全串口,建议打开硬流控(下位机要设置,sscom32也要设置硬流控)。流控就是防止缓存溢出的。
如果只是文本文件的话,可以使用软流控,但要确保传送的数据里不包括0x17和0x19
[/Quote]
分块我的理解是把一个文件压缩成几个比较小的文件分别传送
不知道还有没有其他的方式,比如不压缩也能分块传输...
skylkj 2011-06-13
  • 打赏
  • 举报
回复
文件分块发送,一般用串口都不回一次性传太大的文件的

数据收不全应该是下位机缓存的问题,如果硬件上用的全串口,建议打开硬流控(下位机要设置,sscom32也要设置硬流控)。流控就是防止缓存溢出的。
如果只是文本文件的话,可以使用软流控,但要确保传送的数据里不包括0x17和0x19
schlafenhamster 2011-06-12
  • 打赏
  • 举报
回复
降低波特率试试。
文件太大与缓存有关。
缓存开大些试试。
加流控制试试(XON,XOFF)
串口传输的文件时,是字节流,不分格式。
不过二进制比文本(ASCII)要小
tracyjk 2011-06-12
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 hahahaha_hax4 的回复:]
If you are trying to transfer binary file through UART, you can use protocols like x modem (or y modem, z modem ), which does a better job to handle all the exceptions.
[/Quote]
串口传输的文件时二进制文件还是文本文件怎么设定?
jq_whh 2011-06-11
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 hahahaha_hax4 的回复:]
If you are trying to transfer binary file through UART, you can use protocols like x modem (or y modem, z modem ), which does a better job to handle all the exceptions.
[/Quote]
+++
哈皮歪詩 2011-06-11
  • 打赏
  • 举报
回复
If you are trying to transfer binary file through UART, you can use protocols like x modem (or y modem, z modem ), which does a better job to handle all the exceptions.
yuanfenshiran 2011-06-11
  • 打赏
  • 举报
回复
做个奇偶校验看看
dceacho 2011-06-10
  • 打赏
  • 举报
回复
没用过,不过有种方法楼主可以试下

传输文件时,不仅传输文件某地址内容也传送该地址

例如如果该文件开头为"ABCDEFGHIJKLMN"

发送 0x00 0x00(地址) 'A'(值) 'A'(校验)
发送 0x00 0x01(地址) 'B'(值) xx(校验)

下位机如果校验正确就发下一地址的数据,如果错误就重发

27,511

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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