如何将Turbo Pascal Win32的I / O端口访问转换为C#.Net

以利亚

我有一台硬币柜台机(SC350 / 360),可通过RS232C接口连接到计算机。我有描述通信协议的技术文档,并且还包含用于操作机器的有效pascal程序。我复制了Pascal代码,并使用DosBox在Turbo Pascal上针对Windows 7 64位对其进行了测试,该代码成功编译。我现在想要实现的是将这些pascal代码转换为C#.Net,但由于将串行编程的经验不多,因此很难将几行代码转换为C#。

这是Pascal中用于初始化与机器通信的代码。(将波特率设置为9600、8位,无奇偶校验,1个停止位)

uses crt;
const
{ COM1: RS232 port address }
RXTX = $3F8; { $2F8 if COM2: is used }
ACK = 6;
NAK = 21;
ESC = 27;
var
dummy,
checkSum : integer;
key : char;
protocol : integer;

    var i : integer;
begin
i := 1843200 div 9600 div 16;
port[RXTX + 3] := $80;
port[RXTX + 1] := hi(i);
port[RXTX]:= lo(i);
port[RXTX + 3] := 3;
port[RXTX + 4] := $A;
while odd(port[RXTX + 5]) do
begin
dummy := port[RXTX];
delay(10);
end;
end; { InitComm }

我上面提到的代码对应的C#是;(如果我弄错了,请纠正我)

SerialPort port=new SerialPort("COM1",9600,Parity.None,8,StopBits.One);

但是我不明白如何转换其余的帕斯卡程序。我遇到的一些困难是:

procedure Tx(data : integer);
{ Transmit a character on serial channel }
begin
while port[RXTX + 5] and $20 = 0 do;
port[RXTX] := data and $FF;
end; { Tx }

function RxWait : integer;
{ Waits for a character from serial channel }
begin
while not odd(port[RXTX + 5]) do;
RxWait := port[RXTX];
end; { RxWait }

procedure Tx2(data : integer);
{ Transmit a char on serial channel + Calculate check sum }
begin
Tx(data);
checkSum := (checkSum + data) and $FF;
end; { Tx2 }

你们能帮我如何将这些Pascal代码转换为等效的C#吗?我知道我可以使用'port.Write'方法写入端口,但这无法完全将Turbo Pascal代码与端口阵列配合使用。(例如port[RXTX + 3] := $80;)我不知道端口阵列索引'RXTX + 3'是什么是指与C#相关的内容。

如果您能帮助我,我将非常感激,希望我自己学习转换其余的Pascal代码。:)

我已经从这里的好人那里得到了帮助,为pascal程序编写了以下等效的C#代码。如果我的代码有误,请纠正我。

            public void Tx(int data)
            {
                if (!port.IsOpen)
                    port.Open();
                port.Write(new byte[] { (byte)(data & 0xFF) }, 0, 1);
                port.Close();
            }
            /// <summary>
            /// Wait for a character from serial channel
            /// </summary>
            /// <returns></returns>
            public int RxWait()
            {
                if (!port.IsOpen)
                    port.Open();
                int readByte = port.ReadByte();
                port.Close();
                return readByte;
            }
            /// <summary>
            /// Transmit a char on serial channel + Calculate check sum
            /// </summary>
            /// <param name="data"></param>
            public void Tx2(int data)
            {
                Tx(data);
                checkSum = (checkSum + data) & 0xFF;
            }

顺便说一下,这里是设备文档中描述的协议。

Computer SC 350/360
–––––––> ESC (message start)
–––––––> Command
<––––––> Data (direction depends on command)
<––––––> Check sum (direction depends on command)
<––––––– Receipt:
- ACK (if check sum is correct) or
- NAK (if check sum is incorrect)

而且,我在这里为代码的其余部分提供了一个示例,该命令发送了一个用于计算硬币数量的命令。

 /// <summary>
    /// Transmit command (no data) on serial channel
    /// </summary>
        /// <param name="c1"></param>
        /// <param name="c2"></param>
        /// <param name="sendCheckSum"></param>
        public void TxCommand(char c1, char c2, bool sendCheckSum)
        {
            Tx(ESC);
            checkSum = 0;
            Tx2((int)c1);
            Tx2((int)c2);
            if (sendCheckSum)
            {
                Tx2(checkSum);
                dummy = RxWait();
            }
        }
        /// <summary>
        /// Read n bytes from serial channel
        /// </summary>
        /// <param name="n"></param>
        /// <returns></returns>
        public double ReadNumber(int n)
        {
            double number;
            int i;
            number = checkSum = 0;
            for (i = 0; i < n; i++)
                number = number * 256 + RxWait();
            dummy = RxWait();
            return number;
        }

        /// <summary>
        /// Read the number of Coins counted
        /// </summary>
        /// <returns>Number of Coins</returns>
        public double ReadCountReg()
        {
            TxCommand('R', 'C', false);
            double coinsCounted = ReadNumber(4);
            dummy = RxWait();
            return coinsCounted;
        }

发送命令来计算硬币;

double coinsCounted = ReadCountReg();
 Console.WriteLine(Math.Round(coinsCounted, 0) + " coins counted");

读取计数寄存器的协议为:

Computer SC 350/360
–––––––> ESC
–––––––> “R”
–––––––> “C”
<––––––– CountRegister (CR)
<––––––– (CR ^ FF00,000016 + CR ^ FF,000016 + CR ^ FF0016 +
CR ^ FF16) ^ FF16
<––––––– ACK
v

这里要做的是直接的PC硬件端口(特别是COM1)访问。对于那些奇怪的事情,基本端口+5是8250 UART及其与引脚兼容的后继器件(例如16450和16550)的线路状态寄存器。有关经典PC样式串行端口内部工作的详细信息,请参见此处

不知道您是否能在Windows上正常运行它(而且可以肯定的是,它将永远无法与通过USB连接的串行端口加密狗一起使用),这是DOS代码部分依赖于硬件,具有对时序的完美控制(DOS是单项任务),并且完全知道要使用什么硬件。在大多数情况下,应该有可能依赖Windows(以及您的情况下,.Net框架)提供的功能-上面显示的内容用于发送字节(您可以使用Write方法)。校验和部分应该很容易重现。

.Net提供了一个API SerialPort,应该可以使用该API并消除“过去” DOS时代的这种残余。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何将Turbo Pascal Win32的I / O端口访问转换为C#.Net

来自分类Dev

Windows:如何拦截Win32磁盘I / O API

来自分类Dev

如何从C#或VB.Net使用Win32'DwmSetIconicThumbnail'?

来自分类Dev

如何将Win32鼠标消息转换为WPF鼠标事件?

来自分类Dev

Win32上的异步串行I / O-如何创建警报事件

来自分类Dev

将 win32 hbitmap 转换为 winrt softwarebitmap

来自分类Dev

如何将C#转换为vb.net

来自分类Dev

使用Perl和Win32 :: OLE,如何将Word文档中的编号列表转换为纯文本?

来自分类Dev

将Double从Delphi / Pascal转换为Java

来自分类Dev

Win32 / C:将行尾转换为DOS / Windows格式

来自分类Dev

Win32,如何访问工具栏上的按钮

来自分类Dev

将两个C ++函数转换为Pascal

来自分类Dev

将HeapSort和ShellSort从C转换为Pascal

来自分类Dev

在C ++ Win32程序中,如何修改菜单标题?

来自分类Dev

Win32(C ++):-如何使列表项可折叠

来自分类Dev

请帮助我将 pascal 转换为 C# 代码

来自分类Dev

Turbo Pascal和Turbo C中的性能分析计算

来自分类Dev

C ++ Win32如何将此功能放在单独的cpp文件中?

来自分类Dev

如何仅通过Win32 API实现.NET Process.Exited事件

来自分类Dev

将DOS应用程序转换为Win32控制台应用程序?

来自分类Dev

将DOS应用程序转换为Win32控制台应用程序?

来自分类Dev

如何将Shared VB.NET方法转换为C#

来自分类Dev

如何将特定的代码行从C#转换为VB.net

来自分类Dev

.Net CORE的gRPC-如何将C#[DataContract]类转换为.proto文件的消息

来自分类Dev

如何将公共事件从C#转换为vb.net

来自分类Dev

如何将Lambda从C#转换为VB.NET?

来自分类Dev

C ++,Win32错误

来自分类Dev

如何转换PASCAL VOC为YOLO

来自分类Dev

XSLT将元素名称转换为Pascal大小写

Related 相关文章

热门标签

归档