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));
连接好了,并用串口住手调试成功。
顺便问一下,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位的。
数据保存在RAM中,一般52单片机有256字节的RAM,像STC好多单片机都有1k的RAM扩展,也有EEPROM扩展。 参考技术D 其实每次只能发一个字节,储存在串口特定ram里,如果不够大需要外加存储芯片追问
嗯,RAM不是只有128个字节么?没办吧储存数据啊
追答存数据速度也不快呀,还不如找个spi的ram
第5个回答 2013-11-27 数据太多了吧,简易把数据精简追问显示图片,没办法再精简了
以上是关于C # 如何实现PC的串口通讯(一台PC 双串口通讯),以下程序设计为啥不能发送接收,错在了哪里吗?的主要内容,如果未能解决你的问题,请参考以下文章
52单片机如何对PC串口发送来的数据进行存储,存储在哪?RAM还是ROM中?
C#做上位机,需要跟下位机施行串口通讯,原理是,下位机采集数据,通过串口传到PC机,我的环境是VS2008