c# 232接口 通信

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c# 232接口 通信相关的知识,希望对你有一定的参考价值。

本人初学单片机,想用232接口将开发板的数据传到计算机里(光盘里有232接口的通讯例程,应该没有错误)在上位机这里,我想用c#做个小程序(改的参考书上的例程,错误应该是在这里吧)
不知道哪里的问题,一按"调试"就不动了(不是死机,像一直在运行,生成的时候也没有错误.)
程序如下,恳请各位大神帮忙,如果成功,另有50分奖励.
232的例程(这个是盘里的,应该没有错):

#include <REG52.H>
#include <stdio.h>

void delay(unsigned int i); //函数声明

char code MESSAGE[]= "普中科技助您学习RS232 ,请使用串口调试助手: ";
unsigned char a;

void main (void)

SCON = 0x50; //REN=1允许串行接受状态,串口工作模式2
TMOD|= 0x20; //定时器工作方式2
PCON|= 0x80; //波特率提高一倍
// TH1 = 0xFD; //baud*2 /* reload value 19200、数据位8、停止位1。效验位无(11.0592)
TH1 = 0xF3; // //baud*2 /* 波特率4800、数据位8、停止位1。效验位无 (12M)
TL1 = 0xF3;
TR1 = 1; //开启定时器1
ES = 1; //开串口中断
EA = 1; // 开总中断
// IE = 0x0;

while(1)
a=0;

while(MESSAGE[a] != '\0')

SBUF = MESSAGE[a]; //SUBF接受/发送缓冲器(又叫串行通信特殊功能寄存器)
while(!TI); // 等特数据传送 (TI发送中断标志)
TI = 0; // 清除数据传送标志

a++; // 下一个字符


delay(1000);




/**************************************************

延时处理程序

**************************************************/

void delay(unsigned int i)

unsigned char j;
for(i; i > 0; i--)
for(j = 200; j > 0; j--) ;



在下改写的c#(照着参考书改的,就改了按键1的内容,就改了,这一段,估计错误就在这里了,生成还都没有错,调试也行,就是一按按钮,就不动了):
**************************************************************

namespace 通过串口接收数据

public partial class Form1 : Form


public Form1()

InitializeComponent();


private void button1_Click(object sender, EventArgs e)

serialPort1.PortName = "COM5";
serialPort1.BaudRate = 4800;
serialPort1.Open();
byte[] data = Convert.FromBase64String(serialPort1.ReadLine());
textBox1.Text = Encoding.Unicode.GetString(data);
serialPort1.Close();
MessageBox.Show("数据接收成功!","系统提示");

private void Form1_Load(object sender, EventArgs e)





能不能说得再详细一些啊,谢谢了

参考技术A a=0;

while(1)


while(MESSAGE[a] != '\0')

SBUF = MESSAGE[a]; //SUBF接受/发送缓冲器(又叫串行通信特殊功能寄存器)
while(!TI); // 等特数据传送 (TI发送中断标志)
TI = 0; // 清除数据传送标志

a++; // 下一个字符


delay(1000);


a清零应在循环之外。
参考技术B 你又邮箱吗,我这有全套的东西,可以发过去。c#的上位,c的下位 参考技术C 这几几年的教程了,这么老,直接设置下串口发送数据不就结了本回答被提问者采纳

C# 串行通信 DLL

【中文标题】C# 串行通信 DLL【英文标题】:C# Serial Communication DLL 【发布时间】:2020-04-21 08:59:08 【问题描述】:

我正在 DLL 中开发串行通信协议。我有一个关于这个问题的课程,在那里我用不同的方法分开:

    打开串行通信。 写入和读取数据(到 PLC)。 关闭串行通信。

从使用 DLL 的项目中,我可以打开和关闭串行通信,但是当我使用 write 时,事件处理程序永远不会激活。我不明白为什么。我尝试开发代码以在一个单独的项目(没有 DLL)中测试串行通信,它工作正常,我可以与 PLC 通信。所以我认为可能是我必须让 DLL 保持活动状态,我使用了一些计时器但它不起作用。

DLL 中的串行类:

            public class Serial
            
             SerialPort com = new SerialPort(GlobalData.PLC_ADDRESS, 9600, Parity.None, 8, StopBits.One);

              public void Open()
                
                  // Read event handler
                    com.DataReceived += new SerialDataReceivedEventHandler(com_DataReceived);

                    // Set the read/write timeouts
                    com.ReadTimeout = 400;
                    com.WriteTimeout = 400;
                    // Open the port for communication.
                    com.Open();
    

           public void Talk2PLC()
            
                byte[] cmd =  17, 3, 0, 64, 0, 100, 71, 101;
                com.Write(cmd, 0, cmd.Length);
    


        public void com_DataReceived(object sender, SerialDataReceivedEventArgs e)
        
 Console.WriteLine($"Inside com_DataReceived");

            // Buffer and process binary data
            while (com.BytesToRead > 0)
                PlcBuffer.Add((byte)com.ReadByte());

        public void Close()
        
                // Close the port
                com.Close();


    

从使用这种方法的 DLL 的项目中,我首先调用 Open(),然后调用 Talk2PLC。

我还在DLL中使用了“IsOpen”来检查端口是否打开,我没有复制这里以获得更清晰的代码。

代码进入“com_DataReceived(...)”应该怎么做?我写了一个 Console.WriteLine(..) 来检查它什么时候进入。

【问题讨论】:

【参考方案1】:

我用三菱试了没发现问题,可以在com.Open()之前让com.DtrEnable = true

【讨论】:

以上是关于c# 232接口 通信的主要内容,如果未能解决你的问题,请参考以下文章

问一下:现在的RS232串口通信除了简单的3线(RXD、TXD和GND)通信外,一般还会用到那几根信号线?

RS232接口有啥作用呢?

如何利用设备的RS232接口与三菱FX系列PLC进行通信?

工业机器人-- UART和RS-232RS-422RS-485通信接口

工业机器人-- UART和RS-232RS-422RS-485通信接口

STM32通信串口RS232