(高分求助)怎么用C#语言实现串口通讯,需要程序,急!

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(高分求助)怎么用C#语言实现串口通讯,需要程序,急!相关的知识,希望对你有一定的参考价值。

调用API实现,最好是不用控件,需要源程序!急
总共就这么多分,希望高手能帮忙!谢谢

☆★○●◎◇◆□℃‰?■△▲※→←↑↓〓☆★○●◎◇◆□℃‰?■△▲※→←↑↓〓☆★○●◎◇◆□℃‰?■△▲※→←↑↓〓☆★○●◎◇◆□℃‰?■△▲※→←↑↓〓
通常,在C#中实现串口通信,我们有四种方法:

第一:通过MSCOMM控件这是最简单的,最方便的方法。可功能上很难做到控制自如,同时这个控件并不是系统本身所带,所以还得注册。可以访问
http://www.devhood.com/tutorials/tutorial_details.aspx?tutorial_id=320
一个外国人写的教程
第二:微软在.NET新推出了一个串口控件,基于.NET的P/Invoke调用方法实现,详细的可以访问微软网站
Serial Comm
Use P/Invoke to Develop a .NET Base Class Library for Serial Device Communications

http://msdn.microsoft.com/msdnmag/issues/02/10/netserialcomm/
第三:就是用第三方控件啦,可一般都要付费的,不太合实际,何况楼主不喜欢,不作考虑
第四:自己用API写串口通信,这样难度高点,但对于我们来说,可以方便实现自己想要的各种功能。

我们采用第四种方法来实现串口通信,用现成的已经封装好的类库,常见两个串口操作类是JustinIO和SerialStreamReader。介绍JustinIO的使用方法:

打开串口:

函数原型:public void Open()

说明:打开事先设置好的端口

示例:

using JustinIO;

static JustinIO.CommPort ss_port = new JustinIO.CommPort();
ss_port.PortNum = COM1; //端口号
ss_port.BaudRate = 19200; //串口通信波特率
ss_port.ByteSize = 8; //数据位
ss_port.Parity = 0; //奇偶校验
ss_port.StopBits = 1;//停止位
ss_port.ReadTimeout = 1000; //读超时
try

if (ss_port.Opened)

ss_port.Close();
ss_port.Open(); //打开串口

else

ss_port.Open();//打开串口

return true;

catch(Exception e)

MessageBox.Show("错误:" + e.Message);
return false;


写串口:

函数原型:public void Write(byte[] WriteBytes)

WriteBytes 就是你的写入的字节,注意,字符串要转换成字节数组才能进行通信

示例:

ss_port.Write(Encoding.ASCII.GetBytes("AT+CGMI\r")); //获取手机品牌

读串口:

函数原型:public byte[] Read(int NumBytes)

NumBytes 读入缓存数,注意读取来的是字节数组,要实际应用中要进行字符转换

示例:

string response = Encoding.ASCII.GetString(ss_port.Read(128)); //读取128个字节缓存

关闭串口:

函数原型:ss_port.Close()

示例:

ss_port.Close();

整合代码:
using System;
using System.Runtime.InteropServices;

namespace JustinIO
class CommPort

public int PortNum;
public int BaudRate;
public byte ByteSize;
public byte Parity; // 0-4=no,odd,even,mark,space
public byte StopBits; // 0,1,2 = 1, 1.5, 2
public int ReadTimeout;

//comm port win32 file handle
private int hComm = -1;

public bool Opened = false;

//win32 api constants
private const uint GENERIC_READ = 0x80000000;
private const uint GENERIC_WRITE = 0x40000000;
private const int OPEN_EXISTING = 3;
private const int INVALID_HANDLE_VALUE = -1;

[StructLayout(LayoutKind.Sequential)]
public struct DCB
//taken from c struct in platform sdk
public int DCBlength; // sizeof(DCB)
public int BaudRate; // current baud rate
/* these are the c struct bit fields, bit twiddle flag to set
public int fBinary; // binary mode, no EOF check
public int fParity; // enable parity checking
public int fOutxCtsFlow; // CTS output flow control
public int fOutxDsrFlow; // DSR output flow control
public int fDtrControl; // DTR flow control type
public int fDsrSensitivity; // DSR sensitivity
public int fTXContinueOnXoff; // XOFF continues Tx
public int fOutX; // XON/XOFF out flow control
public int fInX; // XON/XOFF in flow control
public int fErrorChar; // enable error replacement
public int fNull; // enable null stripping
public int fRtsControl; // RTS flow control
public int fAbortOnError; // abort on error
public int fDummy2; // reserved
*/
public uint flags;
public ushort wReserved; // not currently used
public ushort XonLim; // transmit XON threshold
public ushort XoffLim; // transmit XOFF threshold
public byte ByteSize; // number of bits/byte, 4-8
public byte Parity; // 0-4=no,odd,even,mark,space
public byte StopBits; // 0,1,2 = 1, 1.5, 2
public char XonChar; // Tx and Rx XON character
public char XoffChar; // Tx and Rx XOFF character
public char ErrorChar; // error replacement character
public char EofChar; // end of input character
public char EvtChar; // received event character
public ushort wReserved1; // reserved; do not use


[StructLayout(LayoutKind.Sequential)]
private struct COMMTIMEOUTS
public int ReadIntervalTimeout;
public int ReadTotalTimeoutMultiplier;
public int ReadTotalTimeoutConstant;
public int WriteTotalTimeoutMultiplier;
public int WriteTotalTimeoutConstant;


[StructLayout(LayoutKind.Sequential)]
private struct OVERLAPPED
public int Internal;
public int InternalHigh;
public int Offset;
public int OffsetHigh;
public int hEvent;


[DllImport("kernel32.dll")]
private static extern int CreateFile(
string lpFileName, // file name
uint dwDesiredAccess, // access mode
int dwShareMode, // share mode
int lpSecurityAttributes, // SD
int dwCreationDisposition, // how to create
int dwFlagsAndAttributes, // file attributes
int hTemplateFile // handle to template file
);
[DllImport("kernel32.dll")]
private static extern bool GetCommState(
int hFile, // handle to communications device
ref DCB lpDCB // device-control block
);
[DllImport("kernel32.dll")]
private static extern bool BuildCommDCB(
string lpDef, // device-control string
ref DCB lpDCB // device-control block
);
[DllImport("kernel32.dll")]
private static extern bool SetCommState(
int hFile, // handle to communications device
ref DCB lpDCB // device-control block
);
[DllImport("kernel32.dll")]
private static extern bool GetCommTimeouts(
int hFile, // handle to comm device
ref COMMTIMEOUTS lpCommTimeouts // time-out values
);
[DllImport("kernel32.dll")]
private static extern bool SetCommTimeouts(
int hFile, // handle to comm device
ref COMMTIMEOUTS lpCommTimeouts // time-out values
);
[DllImport("kernel32.dll")]
private static extern bool ReadFile(
int hFile, // handle to file
byte[] lpBuffer, // data buffer
int nNumberOfBytesToRead, // number of bytes to read
ref int lpNumberOfBytesRead, // number of bytes read
ref OVERLAPPED lpOverlapped // overlapped buffer
);
[DllImport("kernel32.dll")]
private static extern bool WriteFile(
int hFile, // handle to file
byte[] lpBuffer, // data buffer
int nNumberOfBytesToWrite, // number of bytes to write
ref int lpNumberOfBytesWritten, // number of bytes written
ref OVERLAPPED lpOverlapped // overlapped buffer
);
[DllImport("kernel32.dll")]
private static extern bool CloseHandle(
int hObject // handle to object
);
[DllImport("kernel32.dll")]
private static extern uint GetLastError();

public void Open()

DCB dcbCommPort = new DCB();
COMMTIMEOUTS ctoCommPort = new COMMTIMEOUTS();

// OPEN THE COMM PORT.

hComm = CreateFile("COM" + PortNum ,GENERIC_READ | GENERIC_WRITE,0, 0,OPEN_EXISTING,0,0);

// IF THE PORT CANNOT BE OPENED, BAIL OUT.
if(hComm == INVALID_HANDLE_VALUE)
throw(new ApplicationException("Comm Port Can Not Be Opened"));


// SET THE COMM TIMEOUTS.

GetCommTimeouts(hComm,ref ctoCommPort);
ctoCommPort.ReadTotalTimeoutConstant = ReadTimeout;
ctoCommPort.ReadTotalTimeoutMultiplier = 0;
ctoCommPort.WriteTotalTimeoutMultiplier = 0;
ctoCommPort.WriteTotalTimeoutConstant = 0;
SetCommTimeouts(hComm,ref ctoCommPort);

// SET BAUD RATE, PARITY, WORD SIZE, AND STOP BITS.
GetCommState(hComm, ref dcbCommPort);
dcbCommPort.BaudRate=BaudRate;
dcbCommPort.flags=0;
//dcb.fBinary=1;
dcbCommPort.flags|=1;
if (Parity>0)

//dcb.fParity=1
dcbCommPort.flags|=2;

dcbCommPort.Parity=Parity;
dcbCommPort.ByteSize=ByteSize;
dcbCommPort.StopBits=StopBits;
if (!SetCommState(hComm, ref dcbCommPort))

//uint ErrorNum=GetLastError();
throw(new ApplicationException("Comm Port Can Not Be Opened"));

//unremark to see if setting took correctly
//DCB dcbCommPort2 = new DCB();
//GetCommState(hComm, ref dcbCommPort2);
Opened = true;



public void Close()
if (hComm!=INVALID_HANDLE_VALUE)
CloseHandle(hComm);


public byte[] Read(int NumBytes)
byte[] BufBytes;
byte[] OutBytes;
BufBytes = new byte[NumBytes];
if (hComm!=INVALID_HANDLE_VALUE)
OVERLAPPED ovlCommPort = new OVERLAPPED();
int BytesRead=0;
ReadFile(hComm,BufBytes,NumBytes,ref BytesRead,ref ovlCommPort);
OutBytes = new byte[BytesRead];
Array.Copy(BufBytes,OutBytes,BytesRead);

else
throw(new ApplicationException("Comm Port Not Open"));

return OutBytes;


public void Write(byte[] WriteBytes)
if (hComm!=INVALID_HANDLE_VALUE)
OVERLAPPED ovlCommPort = new OVERLAPPED();
int BytesWritten = 0;
WriteFile(hComm,WriteBytes,WriteBytes.Length,ref BytesWritten,ref ovlCommPort);

else
throw(new ApplicationException("Comm Port Not Open"));







由于篇幅,以及串口通信涉及内容广泛,我在这里只讲这些。
参考技术A //
//bool XmlTextReader.Read(): 读取流中下一个节点,当读完最后一个节点再次调用该方法该方法返回false
//XmlNodeType XmlTextReader.NodeType: 该属性返回当前节点的类型
// XmlNodeType.Element 元素节点
// XmlNodeType.EndElement 结尾元素节点
// XmlNodeType.XmlDeclaration 文档的第一个节点
// XmlNodeType.Text 文本节点
//bool XmlTextReader.HasAttributes: 当前节点有没有属性,返回true或false
//string XmlTextReader.Name: 返回当前节点的名称
//string XmlTextReader.Value: 返回当前节点的值
//string XmlTextReader.LocalName: 返回当前节点的本地名称
//string XmlTextReader.NamespaceURI: 返回当前节点的命名空间URI
//string XmlTextReader.Prefix: 返回当前节点的前缀
//bool XmlTextReader.MoveToNextAttribute(): 移动到当前节点的下一个属性
//---------------------------------------------------------------------------------------------------

namespace XMLReading

using System;
using System.Xml;
using System.Windows.Forms;
using System.ComponentModel;

/// <summary>
/// Xml文件读取器
/// </summary>

public class XmlReader : IDisposable

private string _xmlPath;
private const string _errMsg = "Error Occurred While Reading ";
private ListBox _listBox;
private XmlTextReader xmlTxtRd;

#region XmlReader 的构造器

public XmlReader()

this._xmlPath = string.Empty;
this._listBox = null;
this.xmlTxtRd = null;


/// <summary>
/// 构造器
/// </summary>
/// <param name="_xmlPath">xml文件绝对路径</param>
/// <param name="_listBox">列表框用于显示xml</param>

public XmlReader(string _xmlPath, ListBox _listBox)

this._xmlPath = _xmlPath;
this._listBox = _listBox;
this.xmlTxtRd = null;


#endregion
#region XmlReader 的资源释放方法

/// <summary>
/// 清理该对象所有正在使用的资源

/// </summary>

public void Dispose()

this.Dispose(true);
GC.SuppressFinalize(this);


/// <summary>
/// 释放该对象的实例变量
/// </summary>
/// <param name="disposing"></param>

protected virtual void Dispose(bool disposing)

if (!disposing)
return;
if (this.xmlTxtRd != null)

this.xmlTxtRd.Close();
this.xmlTxtRd = null;


if (this._xmlPath != null)

this._xmlPath = null;



#endregion
#region XmlReader 的属性

/// <summary>
/// 获取或设置列表框用于显示xml
/// </summary>

public ListBox listBox

get

return this._listBox;

set

this._listBox = value;



/// <summary>
/// 获取或设置xml文件的绝对路径
/// </summary>

public string xmlPath

get

return this._xmlPath;

set

this._xmlPath = value;



#endregion

/// <summary>
/// 遍历Xml文件
/// </summary>

public void EachXml()

this._listBox.Items.Clear();
this.xmlTxtRd = new XmlTextReader(this._xmlPath);

try

while(xmlTxtRd.Read())

this._listBox.Items.Add(this.xmlTxtRd.Value);


catch(XmlException exp)

throw new XmlException(_errMsg + this._xmlPath + exp.ToString());

finally

if (this.xmlTxtRd != null)
this.xmlTxtRd.Close();



/// <summary>
/// 读取Xml文件的节点类型
/// </summary>

public void ReadXmlByNodeType()

this._listBox.Items.Clear();
this.xmlTxtRd = new XmlTextReader(this._xmlPath);

try

while(xmlTxtRd.Read())

this._listBox.Items.Add(this.xmlTxtRd.NodeType.ToString());


catch(XmlException exp)

throw new XmlException(_errMsg + this._xmlPath + exp.ToString());

finally

if (this.xmlTxtRd != null)
this.xmlTxtRd.Close();



/// <summary>
/// 根据节点类型过滤Xml文档
/// </summary>
/// <param name="xmlNType">XmlNodeType 节点类型的数组</param>

public void FilterByNodeType(XmlNodeType[] xmlNType)

this._listBox.Items.Clear();
this.xmlTxtRd = new XmlTextReader(this._xmlPath);
try

while(xmlTxtRd.Read())

for (int i = 0; i < xmlNType.Length; i++)

if (xmlTxtRd.NodeType == xmlNType[i])

this._listBox.Items.Add(xmlTxtRd.Name + " is Type " + xmlTxtRd.NodeType.ToString());




catch(XmlException exp)

throw new XmlException(_errMsg + this.xmlPath + exp.ToString());

finally

if (this.xmlTxtRd != null)
this.xmlTxtRd.Close();



/// <summary>
/// 读取Xml文件的所有文本节点值

/// </summary>

public void ReadXmlTextValue()

this._listBox.Items.Clear();
this.xmlTxtRd = new XmlTextReader(this._xmlPath);

try

while(xmlTxtRd.Read())

if (xmlTxtRd.NodeType == XmlNodeType.Text)

this._listBox.Items.Add(xmlTxtRd.Value);



catch(XmlException xmlExp)

throw new XmlException(_errMsg + this._xmlPath + xmlExp.ToString());

finally

if (this.xmlTxtRd != null)
this.xmlTxtRd.Close();



/// <summary>
/// 读取Xml文件的属性
/// </summary>

public void ReadXmlAttributes()

this._listBox.Items.Clear();
this.xmlTxtRd = new XmlTextReader(this._xmlPath);

try

while(xmlTxtRd.Read())

if (xmlTxtRd.NodeType == XmlNodeType.Element)

if (xmlTxtRd.HasAttributes)

this._listBox.Items.Add("The Element " + xmlTxtRd.Name + " has " + xmlTxtRd.AttributeCount + " Attributes");

this._listBox.Items.Add("The Attributes are:");

while(xmlTxtRd.MoveToNextAttribute())

this._listBox.Items.Add(xmlTxtRd.Name + " = " + xmlTxtRd.Value);


else

this._listBox.Items.Add("The Element " + xmlTxtRd.Name + " has no Attribute");

this._listBox.Items.Add("");



catch(XmlException xmlExp)

throw new XmlException(_errMsg + this._xmlPath + xmlExp.ToString());

finally

if (this.xmlTxtRd != null)
this.xmlTxtRd.Close();



/// <summary>
/// 读取Xml文件的命名空间
/// </summary>

public void ReadXmlNamespace()

this._listBox.Items.Clear();
this.xmlTxtRd = new XmlTextReader(this._xmlPath);
try

while(xmlTxtRd.Read())

if (xmlTxtRd.NodeType == XmlNodeType.Element && xmlTxtRd.Prefix != "")

this._listBox.Items.Add("The Prefix " + xmlTxtRd.Prefix + " is associated with namespace " + xmlTxtRd.NamespaceURI);

this._listBox.Items.Add("The Element with the local name " + xmlTxtRd.LocalName + " is associated with" + " the namespace " + xmlTxtRd.NamespaceURI);


if (xmlTxtRd.NodeType == XmlNodeType.Element && xmlTxtRd.HasAttributes)

while(xmlTxtRd.MoveToNextAttribute())

if (xmlTxtRd.Prefix != "")

this._listBox.Items.Add("The Prefix " + xmlTxtRd.Prefix + " is associated with namespace " + xmlTxtRd.NamespaceURI);

this._listBox.Items.Add("The Attribute with the local name " + xmlTxtRd.LocalName + " is associated with the namespace " + xmlTxtRd.NamespaceURI);






catch(XmlException xmlExp)

throw new XmlException(_errMsg + this._xmlPath + xmlExp.ToString());

finally

if (this.xmlTxtRd != null)
this.xmlTxtRd.Close();



/// <summary>
/// 读取整个Xml文件
/// </summary>

public void ReadXml()

string attAndEle = string.Empty;
this._listBox.Items.Clear();
this.xmlTxtRd = new XmlTextReader(this._xmlPath);

try

while(xmlTxtRd.Read())

if (xmlTxtRd.NodeType == XmlNodeType.XmlDeclaration)
this._listBox.Items.Add(string.Format("<?0 1 ?>",xmlTxtRd.Name,xmlTxtRd.Value));
else if (xmlTxtRd.NodeType == XmlNodeType.Element)

attAndEle = string.Format("<0 ",xmlTxtRd.Name);
if (xmlTxtRd.HasAttributes)

while(xmlTxtRd.MoveToNextAttribute())

attAndEle = attAndEle + string.Format("0='1' ",xmlTxtRd.Name,xmlTxtRd.Value);



attAndEle = attAndEle.Trim() + ">";
this._listBox.Items.Add(attAndEle);

else if (xmlTxtRd.NodeType == XmlNodeType.EndElement)
this._listBox.Items.Add(string.Format("</0>",xmlTxtRd.Name));
else if (xmlTxtRd.NodeType == XmlNodeType.Text)
this._listBox.Items.Add(xmlTxtRd.Value);


catch(XmlException xmlExp)

throw new XmlException(_errMsg + this._xmlPath + xmlExp.ToString());

finally

if (this.xmlTxtRd != null)
this.xmlTxtRd.Close();





窗体代码如下:

namespace XMLReading



using System;

using System.Drawing;

using System.Collections;

using System.ComponentModel;

using System.Windows.Forms;

using System.Data;

using System.Xml;

public class Form1 : System.Windows.Forms.Form



private System.Windows.Forms.ListBox listBox1;

private System.Windows.Forms.Button button1;

private System.Windows.Forms.Button button2;

private System.Windows.Forms.Button button3;

private System.Windows.Forms.Button button4;

private System.Windows.Forms.Button button5;

private System.Windows.Forms.Button button6;

private System.Windows.Forms.Button button7;

private string xmlPath;

private XmlReader xRead;

/// <summary>

/// 必需的设计器变量。

/// </summary>

private System.ComponentModel.Container components = null;

public Form1()



InitializeComponent();



/// <summary>

/// 清理所有正在使用的资源。

/// </summary>

protected override void Dispose( bool disposing )



if( disposing )



if (components != null)



components.Dispose();





base.Dispose( disposing );



#region Windows 窗体设计器生成的代码

/// <summary>

/// 设计器支持所需的方法 - 不要使用代码编辑器修改

/// 此方法的内容。

/// </summary>

private void InitializeComponent()



this.listBox1 = new System.Windows.Forms.ListBox();

this.button1 = new System.Windows.Forms.Button();

this.button2 = new System.Windows.Forms.Button();

this.button3 = new System.Windows.Forms.Button();

this.button4 = new System.Windows.Forms.Button();

this.button5 = new System.Windows.Forms.Button();

this.button6 = new System.Windows.Forms.Button();

this.button7 = new System.Windows.Forms.Button();

this.SuspendLayout();

//

// listBox1

//

this.listBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)

| System.Windows.Forms.AnchorStyles.Left)

| System.Windows.Forms.AnchorStyles.Right)));

this.listBox1.ItemHeight = 12;

this.listBox1.Location = new System.Drawing.Point(8, 8);

this.listBox1.Name = "listBox1";

this.listBox1.Size = new System.Drawing.Size(716, 460);

this.listBox1.TabIndex = 0;

//

// button1

//

this.button1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));

this.button1.Location = new System.Drawing.Point(8, 488);

this.button1.Name = "button1";

this.button1.TabIndex = 1;

this.button1.Text = "Example1";

this.button1.Click += new System.EventHandler(this.button1_Click);

//

// button2

//

this.button2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));

this.button2.Location = new System.Drawing.Point(96, 488);

this.button2.Name = "button2";

this.button2.TabIndex = 2;

this.button2.Text = "Example2";

this.button2.Click += new System.EventHandler(this.button2_Click);

//

// button3

//

this.button3.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));

this.button3.Location = new System.Drawing.Point(648, 488);

this.button3.Name = "button3";

this.button3.TabIndex = 3;

this.button3.Text = "Example7";

this.button3.Click += new System.EventHandler(this.button3_Click);

//

// button4

//

this.button4.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));

this.button4.Location = new System.Drawing.Point(184, 488);

this.button4.Name = "button4";

this.button4.TabIndex = 4;

this.button4.Text = "Example3";

this.button4.Click += new System.EventHandler(this.button4_Click);

//

// button5

//

this.button5.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));

this.button5.Location = new System.Drawing.Point(272, 488);

this.button5.Name = "button5";

this.button5.TabIndex = 5;

this.button5.Text = "Example4";

this.button5.Click += new System.EventHandler(this.button5_Click);

//

// button6

//

this.button6.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));

this.button6.Location = new System.Drawing.Point(360, 488);

this.button6.Name = "button6";

this.button6.TabIndex = 6;

this.button6.Text = "Example5";

this.button6.Click += new System.EventHandler(this.button6_Click);

//

// button7

//

this.button7.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));

this.button7.Location = new System.Drawing.Point(448, 488);

this.button7.Name = "button7";

this.button7.TabIndex = 7;

this.button7.Text = "Example6";

this.button7.Click += new System.EventHandler(this.button7_Click);

//

// Form1

//

this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);

this.ClientSize = new System.Drawing.Size(728, 517);

this.Controls.Add(this.button7);

this.Controls.Add(this.button6);

this.Controls.Add(this.button5);

this.Controls.Add(this.button4);

this.Controls.Add(this.button3);

this.Controls.Add(this.button2);

this.Controls.Add(this.button1);

this.Controls.Add(this.listBox1);

this.Name = "Form1";

this.Text = "XMLReader";

this.ResumeLayout(false);

//

// xmlPath

//

this.xmlPath = "sample.xml";



#endregion

/// <summary>

/// 应用程序的主入口点。

/// </summary>

[STAThread]

static void Main()



Application.Run(new Form1());



private void button1_Click(object sender, System.EventArgs e)



xRead = new XmlReader(this.xmlPath,this.listBox1);

try



xRead.EachXml();



catch(XmlException xmlExp)



MessageBox.Show(xmlExp.ToString(),"Error",MessageBoxButtons.OK,MessageBoxIcon.Error);



catch(Exception exp)



MessageBox.Show(exp.ToString(),"Error",MessageBoxButtons.OK,MessageBoxIcon.Error);



finally



xRead.Dispose();





private void button2_Click(object sender, System.EventArgs e)



xRead = new XmlReader(this.xmlPath,this.listBox1);

try



xRead.ReadXmlByNodeType();



catch(XmlException xmlExp)



MessageBox.Show(xmlExp.ToString(),"Error",MessageBoxButtons.OK,MessageBoxIcon.Error);



catch(Exception exp)



MessageBox.Show(exp.ToString(),"Error",MessageBoxButtons.OK,MessageBoxIcon.Error);



finally



xRead.Dispose();





private void button3_Click(object sender, System.EventArgs e)



XmlNodeType[] xmlNType = XmlNodeType.Element, XmlNodeType.EndElement, XmlNodeType.XmlDeclaration;

xRead = new XmlReader(this.xmlPath, this.listBox1);

try



xRead.FilterByNodeType(xmlNType);



catch(XmlException xmlExp)



MessageBox.Show(xmlExp.ToString(),"Error",MessageBoxButtons.OK,MessageBoxIcon.Error);



catch(Exception exp)



MessageBox.Show(exp.ToString(),"Error",MessageBoxButtons.OK,MessageBoxIcon.Error);



finally



xRead.Dispose();





private void button4_Click(object sender, System.EventArgs e)



xRead = new XmlReader(this.xmlPath, this.listBox1);

try



xRead.ReadXmlTextValue();



catch(XmlException xmlExp)



MessageBox.Show(xmlExp.ToString(),"Error",MessageBoxButtons.OK,MessageBoxIcon.Error);



catch(Exception exp)



MessageBox.Show(exp.ToString(),"Error",MessageBoxButtons.OK,MessageBoxIcon.Error);



finally



xRead.Dispose();





private void button5_Click(object sender, System.EventArgs e)



xRead = new XmlReader(this.xmlPath, this.listBox1);

try



xRead.ReadXmlAttributes();



catch(XmlException xmlExp)



MessageBox.Show(xmlExp.ToString(),"Error",MessageBoxButtons.OK,MessageBoxIcon.Error);



catch(Exception exp)



MessageBox.Show(exp.ToString(),"Error",MessageBoxButtons.OK,MessageBoxIcon.Error);



finally



xRead.Dispose();





private void button6_Click(object sender, System.EventArgs e)



xRead = new XmlReader(this.xmlPath, this.listBox1);

try



xRead.ReadXmlNamespace();



catch(XmlException xmlExp)



MessageBox.Show(xmlExp.ToString(),"Error",MessageBoxButtons.OK,MessageBoxIcon.Error);



catch(Exception exp)



MessageBox.Show(exp.ToString(),"Error",MessageBoxButtons.OK,MessageBoxIcon.Error);



finally



xRead.Dispose();





private void button7_Click(object sender, System.EventArgs e)



xRead = new XmlReader(this.xmlPath, this.listBox1);

try



xRead.ReadXml();



catch(XmlException xmlExp)



MessageBox.Show(xmlExp.ToString(),"Error",MessageBoxButtons.OK,MessageBoxIcon.Error);



catch(Exception exp)



MessageBox.Show(exp.ToString(),"Error",MessageBoxButtons.OK,MessageBoxIcon.Error);



finally



xRead.Dispose();







参考技术B //
//bool XmlTextReader.Read(): 读取流中下一个节点,当读完最后一个节点再次调用该方法该方法返回false
//XmlNodeType XmlTextReader.NodeType: 该属性返回当前节点的类型
// XmlNodeType.Element 元素节点
// XmlNodeType.EndElement 结尾元素节点
// XmlNodeType.XmlDeclaration 文档的第一个节点
// XmlNodeType.Text 文本节点
//bool XmlTextReader.HasAttributes: 当前节点有没有属性,返回true或false
//string XmlTextReader.Name: 返回当前节点的名称
//string XmlTextReader.Value: 返回当前节点的值
//string XmlTextReader.LocalName: 返回当前节点的本地名称
//string XmlTextReader.NamespaceURI: 返回当前节点的命名空间URI
//string XmlTextReader.Prefix: 返回当前节点的前缀
//bool XmlTextReader.MoveToNextAttribute(): 移动到当前节点的下一个属性
//---------------------------------------------------------------------------------------------------

namespace XMLReading

using System;
using System.Xml;
using System.Windows.Forms;
using System.ComponentModel;

/// <summary>
/// Xml文件读取器
/// </summary>

public class XmlReader : IDisposable

private string _xmlPath;
private const string _errMsg = "Error Occurred While Reading ";
private ListBox _listBox;
private XmlTextReader xmlTxtRd;

#region XmlReader 的构造器

public XmlReader()

this._xmlPath = string.Empty;
this._listBox = null;
this.xmlTxtRd = null;


/// <summary>
/// 构造器
/// </summary>
/// <param name="_xmlPath">xml文件绝对路径</param>
/// <param name="_listBox">列表框用于显示xml</param>

public XmlReader(string _xmlPath, ListBox _listBox)

this._xmlPath = _xmlPath;
this._listBox = _listBox;
this.xmlTxtRd = null;


#endregion
#region XmlReader 的资源释放方法

/// <summary>
/// 清理该对象所有正在使用的资源

/// </summary>

public void Dispose()

this.Dispose(true);
GC.SuppressFinalize(this);


/// <summary>
/// 释放该对象的实例变量
/// </summary>
/// <param name="disposing"></param>

protected virtual void Dispose(bool disposing)

if (!disposing)
return;
if (this.xmlTxtRd != null)

this.xmlTxtRd.Close();
this.xmlTxtRd = null;


if (this._xmlPath != null)

this._xmlPath = null;



#endregion
#region XmlReader 的属性

/// <summary>
/// 获取或设置列表框用于显示xml
/// </summary>

public ListBox listBox

get

return this._listBox;

set

this._listBox = value;



/// <summary>
/// 获取或设置xml文件的绝对路径
/// </summary>

public string xmlPath

get

return this._xmlPath;

set

this._xmlPath = value;



#endregion

/// <summary>
/// 遍历Xml文件
/// </summary>

public void EachXml()

this._listBox.Items.Clear();
this.xmlTxtRd = new XmlTextReader(this._xmlPath);

try

while(xmlTxtRd.Read())

this._listBox.Items.Add(this.xmlTxtRd.Value);


catch(XmlException exp)

throw new XmlException(_errMsg + this._xmlPath + exp.ToString());

finally

if (this.xmlTxtRd != null)
this.xmlTxtRd.Close();



/// <summary>
/// 读取Xml文件的节点类型
/// </summary>

public void ReadXmlByNodeType()

this._listBox.Items.Clear();
this.xmlTxtRd = new XmlTextReader(this._xmlPath);

try

while(xmlTxtRd.Read())

this._listBox.Items.Add(this.xmlTxtRd.NodeType.ToString());


catch(XmlException exp)

throw new XmlException(_errMsg + this._xmlPath + exp.ToString());

finally

if (this.xmlTxtRd != null)
this.xmlTxtRd.Close();



/// <summary>
/// 根据节点类型过滤Xml文档
/// </summary>
/// <param name="xmlNType">XmlNodeType 节点类型的数组</param>

public void FilterByNodeType(XmlNodeType[] xmlNType)

this._listBox.Items.Clear();
this.xmlTxtRd = new XmlTextReader(this._xmlPath);
try

while(xmlTxtRd.Read())

for (int i = 0; i < xmlNType.Length; i++)

if (xmlTxtRd.NodeType == xmlNType[i])

this._listBox.Items.Add(xmlTxtRd.Name + " is Type " + xmlTxtRd.NodeType.ToString());




catch(XmlException exp)

throw new XmlException(_errMsg + this.xmlPath + exp.ToString());

finally

if (this.xmlTxtRd != null)
this.xmlTxtRd.Close();



/// <summary>
/// 读取Xml文件的所有文本节点值

/// </summary>

public void ReadXmlTextValue()

this._listBox.Items.Clear();
this.xmlTxtRd = new XmlTextReader(this._xmlPath);

try

while(xmlTxtRd.Read())

if (xmlTxtRd.NodeType == XmlNodeType.Text)

this._listBox.Items.Add(xmlTxtRd.Value);



catch(XmlException xmlExp)

throw new XmlException(_errMsg + this._xmlPath + xmlExp.ToString());

finally

if (this.xmlTxtRd != null)
this.xmlTxtRd.Close();



/// <summary>
/// 读取Xml文件的属性
/// </summary>

public void ReadXmlAttributes()

this._listBox.Items.Clear();
this.xmlTxtRd = new XmlTextReader(this._xmlPath);

try

while(xmlTxtRd.Read())

if (xmlTxtRd.NodeType == XmlNodeType.Element)

if (xmlTxtRd.HasAttributes)

this._listBox.Items.Add("The Element " + xmlTxtRd.Name + " has " + xmlTxtRd.AttributeCount + " Attributes");

this._listBox.Items.Add("The Attributes are:");

while(xmlTxtRd.MoveToNextAttribute())

this._listBox.Items.Add(xmlTxtRd.Name + " = " + xmlTxtRd.Value);


else

this._listBox.Items.Add("The Element " + xmlTxtRd.Name + " has no Attribute");

this._listBox.Items.Add("");



catch(XmlException xmlExp)

throw new XmlException(_errMsg + this._xmlPath + xmlExp.ToString());

finally

if (this.xmlTxtRd != null)
this.xmlTxtRd.Close();



/// <summary>
/// 读取Xml文件的命名空间
/// </summary>

public void ReadXmlNamespace()

this._listBox.Items.Clear();
this.xmlTxtRd = new XmlTextReader(this._xmlPath);
try

while(xmlTxtRd.Read())

if (xmlTxtRd.NodeType == XmlNodeType.Element && xmlTxtRd.Prefix != "")

this._listBox.Items.Add("The Prefix " + xmlTxtRd.Prefix + " is associated with namespace " + xmlTxtRd.NamespaceURI);

this._listBox.Items.Add("The Element with the local name " + xmlTxtRd.LocalName + " is associated with" + " the namespace " + xmlTxtRd.NamespaceURI);


if (xmlTxtRd.NodeType == XmlNodeType.Element && xmlTxtRd.HasAttributes)

while(xmlTxtRd.MoveToNextAttribute())

if (xmlTxtRd.Prefix != "")

this._listBox.Items.Add("The Prefix " + xmlTxtRd.Prefix + " is associated with namespace " + xmlTxtRd.NamespaceURI);

this._listBox.Items.Add("The Attribute with the local name " + xmlTxtRd.LocalName + " is associated with the namespace " + xmlTxtRd.NamespaceURI);






catch(XmlException xmlExp)

throw new XmlException(_errMsg + this._xmlPath + xmlExp.ToString());

finally

if (this.xmlTxtRd != null)
this.xmlTxtRd.Close();



/// <summary>
/// 读取整个Xml文件
/// </summary>

public void ReadXml()

string attAndEle = string.Empty;
this._listBox.Items.Clear();
this.xmlTxtRd = new XmlTextReader(this._xmlPath);

try

while(xmlTxtRd.Read())

if (xmlTxtRd.NodeType == XmlNodeType.XmlDeclaration)
this._listBox.Items.Add(string.Format("<?0 1 ?>",xmlTxtRd.Name,xmlTxtRd.Value));
else if (xmlTxtRd.NodeType == XmlNodeType.Element)

attAndEle = string.Format("<0 ",xmlTxtRd.Name);
if (xmlTxtRd.HasAttributes)

while(xmlTxtRd.MoveToNextAttribute())

attAndEle = attAndEle + string.Format("0='1' ",xmlTxtRd.Name,xmlTxtRd.Value);



attAndEle = attAndEle.Trim() + ">";
this._listBox.Items.Add(attAndEle);

else if (xmlTxtRd.NodeType == XmlNodeType.EndElement)
this._listBox.Items.Add(string.Format("</0>",xmlTxtRd.Name));
else if (xmlTxtRd.NodeType == XmlNodeType.Text)
this._listBox.Items.Add(xmlTxtRd.Value);


catch(XmlException xmlExp)

throw new XmlException(_errMsg + this._xmlPath + xmlExp.ToString());

finally

if (this.xmlTxtRd != null)
this.xmlTxtRd.Close();





窗体代码如下:

namespace XMLReading



using System;

using System.Drawing;

using System.Collections;

using System.ComponentModel;

using System.Windows.Forms;

using System.Data;

using System.Xml;

public class Form1 : System.Windows.Forms.Form



private System.Windows.Forms.ListBox listBox1;

private System.Windows.Forms.Button button1;

private System.Windows.Forms.Button button2;

private System.Windows.Forms.Button button3;

private System.Windows.Forms.Button button4;

private System.Windows.Forms.Button button5;

private System.Windows.Forms.Button button6;

private System.Windows.Forms.Button button7;

private string xmlPath;

private XmlReader xRead;

/// <summary>

/// 必需的设计器变量。

/// </summary>

private System.ComponentModel.Container components = null;

public Form1()



InitializeComponent();



/// <summary>

/// 清理所有正在使用的资源。

/// </summary>

protected override void Dispose( bool disposing )



if( disposing )



if (components != null)



components.Dispose();





base.Dispose( disposing );



#region Windows 窗体设计器生成的代码

/// <summary>

/// 设计器支持所需的方法 - 不要使用代码编辑器修改

/// 此方法的内容。

/// </summary>

private void InitializeComponent()



this.listBox1 = new System.Windows.Forms.ListBox();

this.button1 = new System.Windows.Forms.Button();

this.button2 = new System.Windows.Forms.Button();

this.button3 = new System.Windows.Forms.Button();

this.button4 = new System.Windows.Forms.Button();

this.button5 = new System.Windows.Forms.Button();

this.button6 = new System.Windows.Forms.Button();

this.button7 = new System.Windows.Forms.Button();

this.SuspendLayout();

//

// listBox1

//

this.listBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)

| System.Windows.Forms.AnchorStyles.Left)

| System.Windows.Forms.AnchorStyles.Right)));

this.listBox1.ItemHeight = 12;

this.list
参考技术C 和vb一样都是控件!
先安个vb,然后你进c#,添加控件。添加com那种。里面就有mscomm了。用他一切ok。
你要是用2005版的就不必麻烦了。2005在.net框架2.0下已经有自己的了,不用在用com了。幸福。。。
不过我还没转过去呢。在等破解的。
参考技术D Baidu,Google搜一下看看。

高分求助一道C语言设计题 不难!!

1、题目:词汇统计器
2、设计内容及要求:
内容:统计任意的文本文件中指定的一组词汇出现的次数及位置。文本文件中存放的可以为英文文章。
要求有程序 最好还有比较详细的设计分析,我c语言很不好,所以最好有详细的分析,行的话会追加不少分的!!
由于还要交一份报告 所以要有设计思路分析等~!!好的话还会加分~!!拿分机会不要错过~!!

C语言是一种计算机程序设计语言。它既具有高级语言的特点,又具有汇编语言的特点。它由美国贝尔研究所的D.M.Ritchie于1972年推出。1978后,C语言已先后被移植到大、中、小及微型机上。它可以作为工作系统设计语言,编写系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序。它的应用范围广泛,具备很强的数据处理能力,不仅仅是在软件开发上,而且各类科研都需要用到C语言,适于编写系统软件,三维,二维图形和动画。具体应用比如单片机以及嵌入式系统开发。

目录

历史
特点
特色
入门
特点
缺点
c语言 - 语法
运算
结构顺序结构
选择结构
循环结构
模块化程序结构
关键字
经典错误
开发环境
新标在C99中包括的特性
相对于c89的变化
图形编程基于TC中的graphics.h
基于WIN32 API及其他一些图形库
实例
经典教材
类C的中文编程语言
ISO发布C语言新版本历史
特点
特色
入门
特点
缺点
c语言 - 语法
运算
结构
顺序结构 选择结构 循环结构 模块化程序结构关键字经典错误开发环境新标
在C99中包括的特性 相对于c89的变化图形编程
基于TC中的graphics.h 基于WIN32 API及其他一些图形库实例经典教材类C的中文编程语言ISO发布C语言新版本展开编辑本段历史
  C语言的祖先是BCPL语言。   1967年,剑桥大学的 Martin Richards 对CPL语言进行了简化,于是产生了BCPL(Basic Combined Programming Language)语言。   1970年,美国贝尔实验室的 Ken Thompson。以BCPL语言为基础,设计出很简单且很接近硬件的B语言(取BCPL的首字母)。并且他用B语言写了第一个UNIX操作系统。   在1972年,美国贝尔实验室的 D.M.Ritchie 在B语言的基础上最终设计出了一种新的语言,他取了BCPL的第二个字母作为这种语言的名字,这就是C语言。   为了使UNIX操作系统推广,1977年Dennis M.Ritchie发表了不依赖于具体机器系统的C语言编译文本《可移植的C语言编译程序》。   1978年由美国电话电报公司(AT&T)贝尔实验室正式发表了C语言。同时由B.W.Kernighan和D.M.Ritchie合著了著名的《The C Programming Language》一书。通常简称为《K&R》,也有人称之为《K&R》标准。但是,在《K&R》中并没有定义一个完整的标准C语言,后来由美国国家标准化协会(American National Standards Institute)在此基础上制定了一个C语言标准,于一九八三年发表。通常称之为ANSI C。   K&R第一版在很多语言细节上也不够精确,对于pcc这个“参照编译器”来说,它日益显得不切实际;K&R甚至没有很好表达它所要描述的语言,把后续扩展扔到了一边。最后,C在早期项目中的使用受商业和政府合同支配,这意味着一个认可的正式标准是必需的。因此(在M. D. McIlroy的催促下),ANSI于1983年夏天,在CBEMA的领导下建立了X3J11委员会,目的是产生一个C标准。X3J11在1989年末提出了一个他们的报告[ANSI 89],后来这个标准被ISO接受为ISO/IEC 9899-1990。   1990年,国际标准化组织ISO(International Organization for Standards)接受了89 ANSI C 为I SO C 的标准(ISO9899-1990)。1994年,ISO修订了C语言的标准。   1995年,ISO对C90做了一些修订,即“1995基准增补1(ISO/IEC/9899/AMD1:1995)”。1999年,ISO又对C语言标准进行修订,在基本保留原来C语言特征的基础上,针对应该的需要,增加了一些功能,命名为ISO/IEC9899:1999。   2001年和2004年先后进行了两次技术修正。   目前流行的C语言编译系统大多是以ANSI C为基础进行开发的,但不同版本的C编译系统所实现的语言功能和语法规则又略有差别。   2011年12月8日,ISO正式公布C语言新的国际标准草案:ISO/IEC 9899:2011,即C11。   新的标准修改提高了对C++的兼容性,并将新的特性增加到C语言中。新功能包括支持多线程, 基于ISO/IEC TR 19769:2004规范下支持Unicode,提供更多用于查询浮点数类型特性的宏定义和静态声明功能。这些新特性包括:   ● 对齐处理(Alignment)的标准化(包括_Alignas标志符,alignof运算符,aligned_alloc函数以及<stdalign.h>头文件。   ● _Noreturn 函数标记,类似于 gcc 的 __attribute__((noreturn))。   ● _Generic 关键字。   ● 多线程(Multithreading)支持,包括:_Thread_local存储类型标识符,<threads.h>;头文件,里面包含了线程的创建和管理函数。   ● 增强的Unicode的支持。基于C Unicode技术报告ISO/IEC TR 19769:2004,增强了对Unicode的支持。包括为UTF-16/UTF-32编码增加了char16_t和char32_t数据类型,提供了包含unicode字符串转换函数的头文件<uchar.h>.   ● 删除了 gets() 函数,使用一个新的更安全的函数gets_s()替代。   ● 增加了边界检查函数接口,定义了新的安全的函数,例如 fopen_s(),strcat_s() 等等。   ● 增加了更多浮点处理宏。   ● 匿名结构体/联合体支持。这个在gcc早已存在,C11将其引入标准。   ● 静态断言(Static assertions),_Static_assert(),在解释 #if 和 #error 之后被处理。   ● 新的 fopen() 模式,(“…x”)。类似 POSIX 中的 O_CREAT|O_EXCL,在文件锁中比较常用。   ● 新增 quick_exit() 函数作为第三种终止程序的方式。当 exit()失败时可以做最少的清理工作。   ● _Atomic类型修饰符和<stdatomic.h>;头文件。
编辑本段特点
  1. C是高级语言。它把高级语言的基本结构和语句与低级语言的实用性结合起来。C 语言可以像汇编语言一样对位、字节和地址进行操作,而这三者是计算机最基本的工作单元。   2.C是结构式语言。结构式语言的显著特点是代码及数据的分隔化,即程序的各个部分除了必要的信息交流外彼此独立。这种结构化方式可使程序层次清晰,便于使用、维护以及调试。C 语言是以函数形式提供给用户的,这些函数可方便的调用,并具有多种循环、条件语句控制程序流向,从而使程序完全结构化。   3.C语言功能齐全。具有各种各样的数据类型,并引入了指针概念,可使程序效率更高。而且计算功能、逻辑判断功能也比较强大,可以实现决策目的的游戏。   4. C语言适用范围大。适合于多种操作系统,如Windows、DOS、UNIX等等;也适用于多种机型。   C语言对编写需要硬件进行操作的场合,明显优于其它高级语言,有一些大型应用软件也是用C语言编写的。
编辑本段特色
  指针是C语言的一大特色,可以说是C语言优于其它高级语言的一个重要原因。就是因为它有指针,可以直接进行靠近硬件的操作,但是C的指针操作不做保护,也给它带来了很多不安全的因素。C++在这方面做了改进,在保留了指针操作的同时又增强了安全性,受到了一些用户的支持,但是,由于这些改进增加语言的复杂度,也为另一部分所诟病。Java则吸取了C++的教训,取消了指针操作,也取消了C++改进中一些备受争议的地方,在安全性和适合性方面均取得良好的效果,但其本身解释在虚拟机中运行,运行效率低于C++/C。一般而言,C,C++,java被视为同一系的语言,它们长期占据着程序使用榜的前二名。
编辑本段入门
  1.一个C语言源程序可以由一个或多个源文件组成。   2.每个源文件可由一个或多个函数组成。   3.一个源程序不论由多少个文件组成,都有一个且只能有一个main函数,即主函数。   4.源程序中可以有预处理命令(包括include 命令、if命令、pragma命令),预处理命令通常应放在源文件或源程序的最前面。   5.每一个说明,每一个语句都必须以分号结尾。但预处理命令,函数头和花括号“”之后不能加分号。   6.标识符,关键字之间必须至少加一个空格以示间隔。若已有明显的间隔符,也可不再加空格来间隔。
编辑本段特点
  简洁紧凑、灵活方便   C语言一共只有32个关键字,9种控制语句,程序书写形式自由,区分大小写。把高级语言的基本结构和语句与低级语言的实用性结合起来。C 语言可以像汇编语言一样对位、字节和地址进行操作,而这三者是计算机最基本的工作单元。   运算符丰富   C语言的运算符包含的范围很广泛,共有34种运算符。C语言把括号、赋值、强制类型转换等都作为运算符处理。从而使C语言的运算类型极其丰富,表达式类型多样化。灵活使用各种运算符可以实现在其它高级语言中难以实现的运算。   数据类型丰富   C语言的数据类型有:整型、实型、字符型、数组类型、指针类型、结构体类型、共用体类型等。能用来实现各种复杂的数据结构的运算。并引入了指针概念,使程序效率更高。另外C语言具有强大的图形功能,支持多种显示器和驱动器。且计算功能、逻辑判断功能强大。   同时对于不同的编译器也有各种编辑方式。   C是结构式语言   结构式语言的显著特点是代码及数据的分隔化,即程序的各个部分除了必要的信息交流外彼此独立。这种结构化方式可使程序层次清晰,便于使用、维护以及调试。C语言是以函数形式提供给用户的,这些函数可方便的调用,并具有多种循环、条件语句控制程序流向,从而使程序完全结构化。   语法限制不太严格,程序设计自由度大   虽然C语言也是强类型语言,但它的语法比较灵活,允许程序编写者有较大的自由度。   允许直接访问物理地址,对硬件进行操作   由于C语言允许直接访问物理地址,可以直接对硬件进行操作,因此它既具有高级语言的功能,又具有低级语言的许多功能,能够像汇编语言一样对位、字节和地址进行操作,而这三者是计算机最基本的工作单元,可用来写系统软件。   生成目标代码质量高,程序执行效率高   一般只比汇编程序生成的目标代码效率低10%~20%。   适用范围大,可移植性好   C语言有一个突出的优点就是适合于多种操作系统,如MS-DOS、UNIX、Microsoft Windows 以及Linux;也适用于多种机型。C语言效率高,可移植性好,并具备很强的数据处理能力,因此适于编写系统软件,三维,二维图形和动画,它也是数值计算的高级语言。
编辑本段缺点
  1. C语言的缺点主要表现在数据的封装性上,这一点使得C在数据的安全性上有很大缺陷,这也是C和C++的一大区别。   2. C语言的语法限制不太严格,对变量的类型约束不严格,影响程序的安全性,对数组下标越界不作检查等。从应用的角度,C语言比其他高级语言较难掌握。
编辑本段c语言 - 语法
  如果一个变量名后面跟着一个有数字的中括号,这个声明就是数组声明。字符串也是一种数组。它们以ASCII的NUL作为数组的退出。要特别注意的是,方括内的索引值是从0算起的。   指针   如果一个变量声明时在前面使用 * 号,表明这是个指针型变量。换句话说,该变量存储一个地址,而 *(此处特指单目运算符 * ,下同。C语言中另有 双目运算符 *) 则是取内容操作符,意思是取这个内存地址里存储的内容。指针是 C 语言区别于其他同时代高级语言的主要特征之一。   指针不仅可以是变量的地址,还可以是数组、数组元素、函数的地址。通过指针作为形式参数可以在函数的调用过程得到一个以上的返回值(不同于return(z)这样的仅能得到一个返回值。   指针是一把双刃剑,许多操作可以通过指针自然的表达,但是不正确的或者过分的使用指针又会给程序带来大量潜在的错误。   字符串   C语言的字符串其实就是char型数组,所以使用字符串并不需要引用库。但是C标准库确实包含了一些用于对字符串进行操作的函数,使得它们看起来就像字符串而不是数组。使用这些函数需要引用头文件<string.h>;。   文件输入/输出   在C语言中,输入和输出是经由标准库中的一组函数来实现的。在ANSI/ISO C中,这些函数被定义在头文件<stdio.h>;中。   标准输入/输出   有三个标准输入/输出是标准I/O库预先定义的:   stdin 标准输入   stdout 标准输出   stderr 输入输出错误
编辑本段运算
  C语言的运算非常灵活,功能十分丰富,运算种类远多于其它程序设计语言。在表达式方面较其它程序语言更为简洁,如自加、自减、逗号运算和三目运算使表达式更为简单,但初学者往往会觉的这种表达式难读,关键原因就是对运算符和运算顺序理解不透不全。当多种不同运算组成一个运算表达式,即一个运算式中出现多种运算符时,运算的优先顺序和结合规则显得十分重要。在学习中,只要我们对此合理进行分类,找出它们与我们在数学中所学到运算之间的不同点之后,记住这些运算也就不困难了,有些运算符在理解后更会牢记心中,将来用起来得心应手,而有些可暂时放弃不记,等用到时再记不迟。   先要明确运算符按优先级不同分类,《C程序设计》运算符可分为15种优先级,从高到低,优先级为1 ~ 15,除第2.13级和第14级为从右至左结合外,其它都是从左至右结合,它决定同级运算符的运算顺序。
编辑本段结构
顺序结构
  顺序结构的程序设计是最简单的,只要按照解决问题的顺序写出相应的语句就行,它的执行顺序是自上而下,依次执行。   例如:a = 3,b = 5,现交换a,b的值,这个问题就好像交换两个杯子水,这当然要用到第三个杯子,假如第三个杯子是c,那么正确的程序为:c = a; a = b; b = c;执行结果是a = 5,b = c = 3如果改变其顺序,写成:a = b; c = a; b =c;则执行结果就变成a = b = c = 5,不能达到预期的目的,初学者最容易犯这种错误。顺序结构可以独立使用构成一个简单的完整程序,常见的输入、计算,输出三步曲的程序就是顺序结构,例如计算圆的面积,其程序的语句顺序就是输入圆的半径r,计算s = 3.14159*r*r,输出圆的面积s。不过大多数情况下顺序结构都是作为程序的一部分,与其它结构一起构成一个复杂的程序,例如分支结构中的复合语句、循环结构中的循环体等。
选择结构
  顺序结构的程序虽然能解决计算、输出等问题,但不能做判断再选择。对于要先做判断再选择的问题就要使用选择结构。选择结构的执行是依据一定的条件选择执行路径,而不是严格按照语句出现的物理顺序。选择结构的程序设计方法的关键在于构造合适的分支条件和分析程序流程,根据不同的程序流程选择适当的选择语句。选择结构适合于带有逻辑或关系比较等条件判断的计算,设计这类程序时往往都要先绘制其程序流程图,然后根据程序流程写出源程序,这样做把程序设计分析与语言分开,使得问题简单化,易于理解。程序流程图是根据解题分析所绘制的程序执行流程图。   几种基本的选择结构 ①if(条件)
选择体
这种选择结构中的选择体可以是一条语句,此时“”可以省略,也可以是多条语句即复合语句。它有两条分支路径可选,一是当条件为真,执行分支体,否则跳过选择体,这时选择体就不会执行。如:要计算x的绝对值,根据绝对值定义,我们知道,当x>=0时,其绝对值不变,而x<0时其绝对值是为x的反号,因此程序段为:if(x<0)x=-x;
②if(条件)
择路1
else
择路2
这是典型的选择结构,如果条件成立,执行路径1,否则执行路径2,路径1和路径2都可以是1条或若干条语句构成。如:求ax^2+bx+c=0的根
分析:因为当b^2-4ac>=0时,方程有两个实根,否则(b^2-4ac<0)有两个共轭复根。其程序段如下:
int a,b,c,d,x,y;
printf("Please put the number of a,b&c from the quadratic equation of one variable one by one\n");
scanf("%d%d%d",&a,&b,&c);
d=b*b-4*a*c;
if(d<0)

printf("NO Root!Wrong!\n");

else

y=(-b-sqrt(d))/2*a;
x=(-b+sqrt(d))/2*a;
printf("The 1st equation root=%d\nThe 2nd equation root=%d",y,x);

③IF嵌套分支语句:其语句格式为:
if(条件1) 择路1
else if(条件2)择路2
else if(条件3)择路3
……
else if(条件n)择路n
else 择路n+1
FOR嵌套,其语句格式为:
for(初值A;范围A;步长A)

for(初值B;范围B;步长B)

循环体


FOR嵌套例子:九九乘法表
main()

int a,b,c;
for(a=1;a<=9;a++)

for(b=1;b<=a;b++)

c=b*a;
printf("%dx%d=%d ",b,a,c);

printf("\n");


嵌套分支语句虽可解决多个入口和出口的问题,但超过3重嵌套后,语句结构变得非常复杂,对于程序的阅读和理解都极为不便,建议嵌套在3重以内,超过3重可以用下面的语句。
④switch开关语句:该语句也是多选择语句,到底执行哪一块,取决于开关设置,也就是表达式的值与常量表达式相匹配的那一路,它不同if…else语句,它的所有路径都是并列的,程序执行时,由第一分支开始查找,如果相匹配,执行其后的块,接着执行第2路径,第3路径……的块,直到遇到break语句;如果不匹配,查找下一个分支是否匹配。这个语句在应用时要特别注意开关条件的合理设置以及break语句的合理应用。
“?”语句问号语句也是分支的一种,格式类似(a<b)? 语句1:(此处是冒号)语句2;假如括号内为真则执行语句1否则执行语句2

循环结构
  循环结构可以减少源程序重复书写的工作量,用来描述重复执行某段算法的问题,这是程序设计中最能发挥计算机特长的程序结构,C语言中提供四种循环,即goto循环、while循环、do while循环和for循环。四种循环可以用来处理同一问题,一般情况下它们可以互相代替换,但一般不提倡用goto循环,因为强制改变程序的顺序经常会给程序的运行带来不可预料的错误。   特别要注意在循环体内应包含趋于结束的语句(即循环变量值的改变),否则就可能成了一个死循环,这是初学者的一个常见错误。   三个循环的异同点:用while和do…while循环时,循环变量的初始化的操作应在循环体之前,而for循环一般在语句1中进行的;while循环和for循环都是先判断表达式,后执行循环体,而do…while循环是先执行循环体后判断表达式,也就是说do…while的循环体最少被执行一次,而while循环和for就可能一次都不执行。另外还要注意的是这三种循环都可以用break语句跳出循环,用continue语句结束本次循环,而goto语句与if构成的循环,是不能用break和 continue语句进行控制的。   顺序结构、分支结构和循环结构并不彼此孤立的,在循环中可以有分支、顺序结构,分支中也可以有循环、顺序结构,其实不管哪种结构,我们均可广义的把它们看成一个语句。在实际编程过程中常将这三种结构相互结合以实现各种算法,设计出相应程序,但是要编程的问题较大,编写出的程序就往往很长、结构重复多,造成可读性差,难以理解,解决这个问题的方法是将C程序设计成模块化结构。
模块化程序结构
  C语言的模块化程序结构用函数来实现,即将复杂的C程序分为若干模块,每个模块都编写成一个C函数,然后通过主函数调用函数及函数调用函数来实现一大型问题的C程序编写,因此常说:C程序=主函数+子函数。因此,对函数的定义、调用、值的返回等中要尤其注重理解和应用,并通过上机调试加以巩固。    判断语句(选择结构) 循环语句(循环结构) 跳转语句(循环结构:是否循环)
if 语句:“如果”语句 while 语句:“当…”语句 goto 语句:“转舵”语句
if—else 语句:“若…(则)…否则…”语句 do—while 语句:“做…当…(时候)”语句 break 语句:“中断”(循环)语句
switch 语句:“切换”语句 for 语句:条件语句(即“(做)…为了…”语句) continue 语句:“继续”语句(结束本次循环,继续下一次循环)
switch—case:“切换—情况”语句 ​ return 语句:“返回馈”语句

编辑本段关键字
  关键字就是已被C语言本身使用,不能作其它用途使用的字。例如关键字不能用作变量名、函数名等   由ANSI标准定义的C语言关键字共32个:   auto double int struct break else long switch   case enum register typedef char extern return union   const float short unsigned continue for signed void   default goto sizeof volatile do if while static   根据关键字作用将关键字分为数据类型关键字和流程控制关键字两大类 大类 小类 名称与作用
1 数据类型关键字 A.基本数据类型(5个) void:声明函数无返回值或无参数,声明无类型指针,显式丢弃运算结果
char:字符型类型数据,属于整型数据的一种
int:整型数据,通常为编译器指定的机器字长
float:单精度浮点型数据,属于浮点数据的一种
double:双精度浮点型数据,属于浮点数据的一种
B .类型修饰关键字(4个) short:修饰int,短整型数据,可省略被修饰的int。
long:修饰int,长整形数据,可省略被修饰的int。
signed:修饰整型数据,有符号数据类型
unsigned:修饰整型数据,无符号数据类型
C .复杂类型关键字(5个) struct:结构体声明
union:共用体声明
enum:枚举声明
typedef:声明类型别名
sizeof:得到特定类型或特定类型变量的大小
D .存储级别关键字(6个) auto:指定为自动变量,由编译器自动分配及释放。通常在栈上分配
static:指定为静态变量,分配在静态变量区,修饰函数时,指定函数作用域为文件内部
register:指定为寄存器变量,建议编译器将变量存储到寄存器中使用,也可以修饰函数形参,建议编译器通过寄存器而不是堆栈传递参数
extern:指定对应变量为外部变量,即标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。
const:与volatile合称“cv特性”,指定变量不可被当前线程/进程改变(但有可能被系统或其他线程/进程改变)
volatile:与const合称“cv特性”,指定变量的值有可能会被系统或其他进程/线程改变,强制编译器每次从内存中取得该变量的值
参考技术A http://wenku.baidu.com/view/5eef080216fc700abb68fcd3.html供参考,这种设计题估计你给别人钱,别人才会给你做的那么详细。。。 参考技术B 不难你还问~

以上是关于(高分求助)怎么用C#语言实现串口通讯,需要程序,急!的主要内容,如果未能解决你的问题,请参考以下文章

急急急!!!高分求助,C语言(C#,ASP.NET)写1至7随机4位数字组合,顺序不限,满意加分,

高分求助:C#中如何调用UpdateResource这个API函数!

高分诚心求助!数据库设计如何实现不同用户进行不同操作的权限管理?!(数据库SQL2000+编程语言C#)

C语言求助。急急

高分求助:怎么处理百万条的excel数据

高分求助一道C语言设计题 不难!!