C # 如何实现PC的串口通讯(一台PC 双串口通讯),以下程序设计为啥不能发送接收,错在了哪里吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C # 如何实现PC的串口通讯(一台PC 双串口通讯),以下程序设计为啥不能发送接收,错在了哪里吗?相关的知识,希望对你有一定的参考价值。

界面设置了 两个Button按钮,按钮二用来发送数据,按钮一用来关闭程序;两个Textbox,Textbox2 用来输入要发送的数据, Textbox1 用来接收发送过来的数据。同时有两个serialPort控件 和一个Timer控件。 程序如下:

namespace WindowsFormsApplication11

public partial class Form1 : Form

string data;
public Form1()

InitializeComponent();

private void button2_Click(object sender, EventArgs e)

string outdata = textBox2.Text;
if (outdata == "")

MessageBox.Show("发送的数据不能为空!", "");

serialPort1.Write(outdata);

private void button1_Click(object sender, EventArgs e)

serialPort1.Close();
serialPort2.Close();
Close();

private void Form1_Load(object sender, EventArgs e)

serialPort1.PortName = "COM3";
serialPort1.BaudRate = 9600;
serialPort1.Open();
serialPort2.PortName = "COM1";
serialPort2.BaudRate = 9600;
serialPort2.Open();

private void DisplayText(object sender, EventArgs e)

textBox1.Text = textBox1.Text + data;

private void serialPort2_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)

data = serialPort2.ReadExisting();
this.Invoke(new EventHandler(DisplayText));


参考技术A 看你的代码里面确实没办法接受的,因为你用serialPort1发送那么数据是在serialPort1里面的,而你后面是用serialPort2接受,可是serialPort2根本没有数据你怎么接受呢。 参考技术B 会不会是多线程的问题,COM1一直占用线程?你试着发送数据的时候开一个线程发送数据。本回答被提问者采纳 参考技术C 你把端口连起来了吗追问

连接好了,并用串口住手调试成功。
顺便问一下,PC机之间的文件传输的代码,有没有?

52单片机如何对PC串口发送来的数据进行存储,存储在哪?RAM还是ROM中?

ROM不是存储程序的么,怎么存储接受数据?数据大小为1160字节,跪求精通串口通信大神解救,百思不得其解啊!如果连续发送三次数据,大小分别是1160,1360,1800字节要怎么分别存储在单片机中?怎么定义存储地点?新人接触串口通信。。。能有具体C程序解释更棒了!

参考技术A STC内部有256字节的ram,还有1024bytes的扩展RAM,请查看数据手册,但这显然不能满足你的要求,所以建议你使用外部扩展Ram,选择6264(8K)的RAM就可以了,怎么接请参看C51外部RAM扩展相关文档,另外不建议使用FlashRom存取,因为首先有写入次数限制,在写入时需要擦出整个扇区,不知道这样说你清楚不?
定义你的接收缓冲区:
#define MAX_BUF_LEN 1800
xdata char cRxdBuf[MAX_BUF_LEN];//data 指底128bytes,idata指高128bytes,xdata指外部RAM
另外,接外部RAM时记得禁止扩展的1024Bytes,否则会产生冲突。追问

感谢你,资料查了很多,大概懂你的意思,我还是想用片内EEPROM来存放这三组数据,而且片内EEPROM有4K已经满足大小的要求了

追答

哦,你一定要这样作那也可以哈,不过超过擦出次数你的东西就挂掉了,另外STC手册上有例程,可以直接拿来用。

参考技术B STC单片机内部有部分空间是EEPROM,可以存储数据。

串口收到的数据存在EEPROM中是可以的,但写数据前,需先擦除。

串口波特率是多少,写入数据有时间要求?追问

嗯,是STC的片,波特率是9600,写入数据的是时间没要求。有4K的EEPROM,但是C没学到家,不知道怎么样写这段数据存储程序,能具体点求教么?新人不懂的太多,时间又紧

追答
/*向单片机内部EEPROM空间读出一字节数据*/
uchar read_51flash_controlword(uint eeprom_addr)             

uchar temp;

IAP_CONTR=0X83;
IAP_CMD =read_cmd;//字节读命令,,

IAP_ADDRL=eeprom_addr&0xff;
IAP_ADDRH=eeprom_addr>>8;

IAP_TRIG=0X5a;
IAP_TRIG=0Xa5;//
//delay_nus(2);
Nop();
temp=IAP_DATA;

IAP_CONTR=0X00;
IAP_CMD =0X00;
IAP_TRIG=0X00;
IAP_ADDRH=0Xff;
IAP_ADDRL=0Xff;
return temp ;

void write_51eeprom_1byte(uint eeprom_addr,uchar w_data)//写数据到指定地址


IAP_CONTR=0X83;
IAP_CMD =program_cmd;//字节编程命令,,

IAP_ADDRL=eeprom_addr&0xff;
IAP_ADDRH=eeprom_addr>>8;

IAP_DATA =w_data;

IAP_TRIG=0X5a;
IAP_TRIG=0Xa5;//
Nop();
IAP_CONTR=0X00;
IAP_CMD =0X00;
IAP_TRIG=0X00;
IAP_ADDRH=0Xff;
IAP_ADDRL=0Xff;


/*擦除单片机内部EEPROM空间一个数据的扇区*/
void earse_one_sector_in51_ctr(uint  eeprom_page_addr)


EA=0;
IAP_CONTR=0X83;
IAP_CMD =erase_cmd;//字节擦除命令,, IAP_CMD

IAP_ADDRH=eeprom_page_addr>>8;
IAP_ADDRL=eeprom_page_addr;

IAP_TRIG=0X5a;
IAP_TRIG=0Xa5;//
//delay_nus(2);
Nop();
Nop();
IAP_CONTR=0X00;
IAP_CMD =0X00;
IAP_TRIG=0X00;
IAP_ADDRH=0Xff;
IAP_ADDRL=0Xff;
EA=1;

追问

十分感谢,一定给你满意答案,但是有还有两个点没看懂,1.这段程序的存储地址是从哪个地址开始的?2.若果要接受串口的数据,需要把我Receive()这个函数写到那个语句。谢谢了!

追答

地址,需要根据具体的芯片来决定,不同的芯片地址空间是不同的。

这三个是子程序,写数据时,收完数据后就可以调用这几个函数。

例如:

Receive(); //接收数据完成

earse_one_sector_in51_ctr(); //先擦除,要给定擦除地址
write_51eeprom_1byte();//写数据,给定地址,和要写的数据

追问

第6句:IAP_CONTR=0X83;中的83是什么意思?是擦除地址么?

追答

不是的,这是根据芯片资料里说的来的。
包括5a,a5,都是根据芯片资料来的。不同芯片,这些数据可能不同。

地址是16位的,不是8位的。

本回答被提问者采纳
参考技术C 如果数据要保存,建议用EEPROM!掉电可保存。比如24C02,引脚少,通信简单。
数据保存在RAM中,一般52单片机有256字节的RAM,像STC好多单片机都有1k的RAM扩展,也有EEPROM扩展。
参考技术D 其实每次只能发一个字节,储存在串口特定ram里,如果不够大需要外加存储芯片追问

嗯,RAM不是只有128个字节么?没办吧储存数据啊

追答

存数据速度也不快呀,还不如找个spi的ram

第5个回答  2013-11-27 数据太多了吧,简易把数据精简追问

显示图片,没办法再精简了

以上是关于C # 如何实现PC的串口通讯(一台PC 双串口通讯),以下程序设计为啥不能发送接收,错在了哪里吗?的主要内容,如果未能解决你的问题,请参考以下文章

rs232串口通信光电(红外)隔离电路设计

52单片机如何对PC串口发送来的数据进行存储,存储在哪?RAM还是ROM中?

使用串口线真机调试Linux内核

C#做上位机,需要跟下位机施行串口通讯,原理是,下位机采集数据,通过串口传到PC机,我的环境是VS2008

能帮我解释下PC机通过rs485串口接收智能电表的数据,具体过程是怎样实现的,谢谢

串口数据流抓包监控监视侦听监测获取PC软件和串口设备