<font color=green><u><i>一个关于"可编程<b>串</b>行通信<b&g

  • 主题发起人 主题发起人 cat.yy
  • 开始时间 开始时间
C

cat.yy

Unregistered / Unconfirmed
GUEST, unregistred user!
<font color=green><u><i>一个关于"可编程<b>串</b>行通信<b>口</b>"的问题</i></u></font>(50分)<br /> 我现在正编一个串口通信的程序,遇到两个问题 一时无法解决
想各位大侠求助!!

问题:
1。 我手头的资料都是关于8086/80286 串口(RS-232标准)的资料,不知道是否适用
于当今的微机(相关<b>芯片</b>的<b>外部接口</b>是否没有改变)?
2。 IBM PC 机上有两个通讯口(com1和com2)的编址分别为:2FxH 和 3FxH ,现在
通过地址扩展卡将com口扩展到 8 个 ---- 该怎样编址呢?

有劳大家了,我将在Delphi中嵌入汇编程序,所以必须了解清楚。

-------------------------------------------------------------------------------
谁有纯delphi编的串口通讯的例程? 可否给我一份?(<font color=green><i>catyy1101@263.net</i></font>)
万分感谢!!
 
windows下专门的串口通讯函数的。
关于com口通讯的控件很多,我推荐用spcomm
 
怎么没有人回答??
我先回答自己的第一个问题 ---- 那个芯片的编程接口没有改变。
第二个问题还请大家帮忙看看(50分呢!)

------------------------------------------------------------------------------
昨天,我用内嵌汇编成功的编写了读写串口的程序。(我用一根线把自己的com1
com2连起来,自发自收,用于50米内近距离通讯(不用modam),你稍改一下即可
用到自己的程序中了。)

我把程序贴在这儿 供大家参考:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
程序的核心代码如下:
-- <font color=blue><i>窗体文件:</i></font> -----------------------------------
object Form1: TForm1
Left = 277
Top = 114
Width = 544
Height = 375
Caption = 'Form1'
Color = clBtnFace
Font.Charset = GB2312_CHARSET
Font.Color = clWindowText
Font.Height = -15
Font.Name = '宋体'
Font.Style = []
OldCreateOrder = False
OnCreate = FormCreate
PixelsPerInch = 120
TextHeight = 15
object Button2: TButton
Left = 120
Top = 20
Width = 94
Height = 31
Caption = '发 --> 收'
TabOrder = 0
OnClick = Button2Click
end
object Button3: TButton
Left = 20
Top = 20
Width = 94
Height = 31
Caption = '初始化'
TabOrder = 1
OnClick = Button3Click
end
object Edit1: TEdit
Left = 20
Top = 90
Width = 151
Height = 20
TabOrder = 2
end
object Button1: TButton
Left = 180
Top = 90
Width = 61
Height = 31
Caption = '=>aa'
TabOrder = 3
OnClick = Button1Click
end
end
-- <font color=blue><i>单元文件</i></font> ----------------------------------------
unit Unit_com;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TForm1 = class(TForm)
Button2: TButton;
Button3: TButton;
Edit1: TEdit;
Button1: TButton;
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
aa:char;
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button2Click(Sender: TObject);<font color=green><i>//发送和接收</i></font>
var sc,rc:char; yy:integer;
begin
sc := aa;
asm
push ax
push dx
// ------------
mov dx,2FBH
in al,dx
and al,7FH <font color=green><i>//将线路控制寄存器LCR的最高位置 0,表示可以访问RBR或THR</i></font>
out dx,al
//
@_1:
mov dx,2F8H
mov al,sc <font color=green><i>//将待发送数据送THR</i></font>
out dx,al
//
mov dx,2FDH <font color=green><i>//测试LSR,确定是否正确发送</i></font>
in al,dx
test al,20H
jnz @_1
//
mov dx,3F8H
in al,dx
// ------------
pop dx
pop ax
end;
// ----------------
asm
push ax
push dx
// ------------
mov dx,3FBH
in al,dx
and al,7FH
out dx,al
//
@_2:
mov dx,3FDH
in al,dx
or al,01H <font color=green><i>//接收数据准备好</i></font>
out dx,al
test al,01H
jnz @_2
//
mov dx,3F8H <font color=green><i>//接收数据到RBR</i></font>
in al,dx
mov rc,al
// ------------
pop dx
pop ax
end;
aa := rc;
showmessage('收到的数据'+aa+'。');
//
yy := 0; <font color=green><i>//将收到的数据用ASCII码显示</i></font>
while not(aa=chr(yy)) do
yy := yy +1;
showmessage(inttostr(yy));
end;

procedure TForm1.Button3Click(Sender: TObject);<font color=green><i>//初始化串口</i></font>
begin
asm
push dx
push ax
// -----------
mov dx,3F8H <font color=green><i>//设置波特率:1200</i></font>
mov al,60H
out dx,al
mov dx,3F9H
mov al,0
out dx,al
//
mov dx,3FBH <font color=green><i>//奇校验,1位停止位,7位数据位</i></font>

mov al,0AH
out dx,al
//
mov dx,3F9H //设中断允许寄存器为0,屏蔽4种中断
mov al,0
out dx,al
// ----------
mov dx,2F8H
mov al,60H
out dx,al
mov dx,2F9H
mov al,0
out dx,al
//
mov dx,2FBH
mov al,0AH
out dx,al
//
mov dx,2F9H
mov al,0
out dx,al
// ----------
pop ax
pop dx
end;
showMessage(' 串口:COM1 COM2 初始化完毕。'+chr(13)+
chr(13)+' * --- 波特率:1200'+
chr(13)+' * --- 奇校验,1位停止位,7位数据位 ');
end;

<font color=green><i>//功能:将用户输入edit1内的一个字符转成char型</i></font>
procedure TForm1.Button1Click(Sender: TObject);
var dd:string;
begin
dd := edit1.Text; <font color=red><i>//只能输入一个字符(多了会出错)</i></font>
aa := dd[1];
end;

end.
+++++++++++++++++++++++++++++++++++++++++
<font color=red><i>使用说明</i></font>
先点击 窗体上的“<b>初始化</b>”按纽
再 向文本框中输入<b>一个</b>ASCII字符
然后点 窗体上的“<b>=>aa</b>”按纽
最后点 窗体的“<b>发 --> 收</b>”按纽

 
其实,你何必要使用到汇编语言呢?
关于COM口通信有许多的控件的啊,如 Async,spcomm....
 
用<b>控件</b>不够直接(我也<b>想知道怎么用</b>)
如果用<b>API</b>该怎么实现呢(最好有供学习的原码)?
 
看看我问的问题的第3页,也许有帮助。
我的毕业设计就看那个搞出来的。
BTW:汇编俺没学会:(
 
你的结论有点不正确
现在用的芯片是16550,跟以前的区别是16550有FIFO,
我大致看了一下你的程序,如果不是自收自发,可能有出错的机会
另外,扩展串口板的基址一般是可以通过DIP设定的,4口以上已经没有标准了
4口以内的一般$3f0, $2f0,$3e0,$2e0
 
to iie:

我头皮有点麻,跟我说详细点,先不忙谈扩展地址的问题。

>>可能有出错的机会
那里?
循环那里我没有设出口,一旦错误发生 会造成死循环的。
还有什么地方会出错?
顺便说明:程序不需要远程通讯的功能。

请你指教

 
‘程序不需要远程通讯‘的含义?难道你就作上面这个程序就可以交差?

主要是接收的地方,连续的数据流过来,你的程序应该轮询或者中断接收
我指出错的部分是16550的FIFO,这是跟PC/XT系统的区别,
其实有许多象老的单片机开发机,上到586上就不好用了。
当然你如果不用也可以禁止它:
port[base + 3] := 0;
base + 3 就是FCR - FIFO Control Register
 
接收批评,不过我想要一份16550的较详细的资料(特别是详细的接口资料),您
能否寄我一份(我知道你是这方面的行家)?
 
承蒙抬爱,PDF文件发你注册信箱
 
我贴的程序中的 tform1.Button2Click(...) 中 begin 后<b>第一次</b>出现的
mov dx,3F8H
in al,dx
语句应删去(这是测试语句,没删干净)
 
1)16550.PDF收到否?
2)网人本无性别之分
3)串行传输帧中要包括起始位、停止位、校验位,所以传输一个字节不是8位
 
1。 收到了,只是找不到工具读
2。 iie兄,你好
3。 看到我刚提的问题了吗,我还有些问题不明白
 
后退
顶部