一个关于用delphi向串口发数据的问题

1978322 2000-05-23 01:18:00
我在delphi下安装了mscomm这个ocx控件,用它向串口发数据(串口接了一个我自己制作的单片机电路),不过没次接收到的数据都有错误,我也调了波特率,但是还是不行,有那为大虾能帮我解决!
...全文
243 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
meijg 2000-05-29
  • 打赏
  • 举报
回复
对于你的单片机程序,我认为有以下几点问题,现提出来与你交流一下:
1、在计算波特率的时候,不知你用的是多少,据我计算可能是2400bps,
这要基于以下几个条件:smod=1、fosc=11.059mhz、th1=e8h(这是你程序里的是设定值)
在这里smod=1是很关键的,如果没有将smod设为1,则计算出的波特率就为1200bps,
不知是否与你的想法吻合。
2、另外我发现在你的LJ1程序段里,好象有些问题,提出来分析一下:
当跳转进入LJ1时,dz中为从pc机收到的数据,接着以dz中的值来累加30h中的值,但是在判断条件
cjne a,30ah,lj处会有问题,因为你的30h内的初始值是#0fh,累加的结果无法满足你的条件(逢十进一)
这样送到显示程序的数就不是你期望的值了,是否应将30h的初始值设为00h(31h、32h也是同样的)
3、关于串行方式的选择我想谈谈我的看法,不知你选择方式3是什么用意,在sm2=1的情况下,若第九位
数据(RB8)为0时,RI是不置位的,也就是单片机认为没有数据,不知在pc端你是怎么处理的?
我建议如果没有特别的要求,还是使用方式1比较好一点。
最后希望能多交流,在这里能遇到做单片机的满珍贵。
有什么问题可以直接E-mail:meijg@elong.com
1978322 2000-05-27
  • 打赏
  • 举报
回复
下面是我写的单片机接收程序,不知有没有错误,请各位指点!
PML EQU 0D000H
PA EQU 0D001H
PB EQU 0D002H
PCC EQU 0D003H
DBPS EQU 0E8H
TX BIT 20H.0
DZ EQU 36H
ORG 0000H
AJMP MAIN
ORG 0023H
AJMP INTU
ORG 0100H
MAIN:MOV R0,#20H
MOV R7,#60H
MAIN0:MOV @R0,#00H
INC R0
DJNZ R7,MAIN0
MOV SP, #40H
SETB EA
SETB ES
MOV TMOD,#20H
MOV TH1,#DBPS
MOV TL1,#DBPS
SETB TR1
MOV SCON,#0D0H
MOV 30H,#0FH
MOV 31H,#0DH
MOV 32H,#0CH
MOV 33H,#0BH
MOV 34H,#0AH
MOV 35H,#0FH
GOOD:JB TX,LJ1
AJMP LED

INTU:JBC RI,RR1
JBC TI,RR2
RETI
RR1:MOV A,SBUF
MOV DZ,A
SETB TX
RR2:RETI

LJ1:MOV R4,DZ
LJ0:INC 30H
MOV A,30H
CJNE A, #0AH,LJ
MOV 30H,#00H
INC 31H
MOV A,31H
CJNE A, #0AH,LJ
MOV 31H,#00H
INC 32H
LJ:DJNZ R4,LJ0
MOV 33H,#0FH
MOV 34H,#0FH
MOV 35H,#0FH

LED:MOV DPTR,#PML
MOV A,#0FH
MOVX @DPTR,A
MOV R0,#30H
MOV R3,#01H
MOV A,R3
LD02:MOV A,#0FFH
MOV DPTR,#PA
MOVX @DPTR,A
MOV A,R3
MOV DPTR,#PCC
MOVX @DPTR,A
MOV A,@R0
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV DPTR,#PA
MOVX @DPTR,A
ACALL DL
INC R0
MOV A,R3
JB ACC.5,LD1
RL A
MOV R3,A
AJMP LD02
LD1:AJMP GOOD
TABLE:DB 0C0H,0F9H,0A4H,0B0H,99H
DB 92H,82H,0F8H,80H,90H
DB 90H,0A3H,0A3H,0A1H,86H
DB 0FFH

laolie 2000-05-27
  • 打赏
  • 举报
回复
双方的定义要一致 如都是asc码 or 都是十六进制数 萡特率一致等
1978322 2000-05-27
  • 打赏
  • 举报
回复
InputMode好象是PC机接收的属性,我说的是单片机接收到PC机发送的数据有错误!
Un1 2000-05-23
  • 打赏
  • 举报
回复
必须设置InputMode为comInputModeBinary以及确认Settings格式正确
flylt 2000-05-23
  • 打赏
  • 举报
回复
详细点
在工程实践中经常需要实现上下位机间的串口通信,为了编程的方便性我们通常采用字符方式进行数据传输,由于需要数据转换以及转换后的数据长度增加,数据传输速度不够理想,为了提高系统实时性在某些特殊场合更需要直接采用二进制进行数据传输。Delphi6.0是一种面向对象的可视化的快速应用开(RAD)工具,它既具有C++语言的强大功能,同时又有VB的易用性,Delphi6.0的伸缩性强,既可用于开小项目,也可用于开大项目,尤其适用于快速应用的开,其大量优点使它迅速成为一种非常流行的编程语言。Delphi6.0中串口通信的实现方法很多,可以使用嵌入式汇编语言、API函数以及VB的MSComm控件来实现。其中使用MSComm控件来实现串口通信最方便,但有关Delphi如何实现二进制通信的资料很少,大部分参考书都只介绍了VB中MSComm控件的字符通信方式。由于Delphi中数组跟Variant变量不兼容,即在Delphi中字节数组不能直接赋值给MSComm控件的output属性,这跟VB有中很大的不同(VB中可以直接赋值),本人通过摸索总结出两种实现Delphi二进制通信的方法,即动态数组法和可变数组(Variant Array)法,并给出了应用实例。在应用实例中我们使用Delphi的absolute关键字来定义两个同地址的动态数组,类型分别为字节型数组和短整型数组,使用字节动态数组接收数据后,可以直接使用短整型动态数组获得短整型数据,省却了数据转换的麻烦

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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