应该是有返回值的吧,有返回值的话,return 0这句就执行孙败隐此不到了,
int CSDICommView::OnCreate(LPCREATESTRUCT lpCreateStruct) 的建议就“建立空文档失败”
//m_MSComm.GetInput()//先预读缓冲区,以清除残留数据 这句
可以放在真正读数据之前。
在窗体上点右键,出现菜单,添加控件,找到 serialport 完成添加串口主要有以下携腔几个参数:
1.串口名称(PortName)
2.波特率(BaudRate)
3.数据位(DataBits)
4.奇偶辩模衫效应(Parity)
5.停止位码桥(StopBits)
1 using System
2 using System.Collections.Generic
3 using System.Linq
4 using System.Text
5 using System.Windows
6 using System.Windows.Controls
7 using System.Windows.Data
8 using System.Windows.Documents
9 using System.Windows.Input
10 using System.Windows.Media
11 using System.Windows.Media.Imaging
12 using System.Windows.Navigation
13 using System.Windows.Shapes
14 using System.IO.Ports
15
16 namespace CsharpComm
17 {
18 /// <summary>
19 /// Window1.xaml 的交互逻辑
20 /// </summary>
21 public partial class Window1 : Window
22 {
23 public Window1()
24 {
25 InitializeComponent()
26 }
27
28 //定义 SerialPort对象
29 SerialPort port1
30
31 //初始化SerialPort对象方法.PortName为COM口名称,例如"COM1","COM2"等,注意是string类型
32 public void InitCOM(string PortName)
33 {
34 port1 = new SerialPort(PortName)
35 port1.BaudRate = 9600//波特率
36 port1.Parity = Parity.None//无奇偶校验位
37 port1.StopBits = StopBits.Two//两个停止位
38 port1.Handshake = Handshake.RequestToSend//控制协议
39 port1.ReceivedBytesThreshold = 4//设置 DataReceived 事件发生前内部输入缓冲区中的字节数
40 port1.DataReceived += new SerialDataReceivedEventHandler(port1_DataReceived)//DataReceived事件委托
41 }
42
43 //DataReceived事件委托方法
44 private void port1_DataReceived(object sender, SerialDataReceivedEventArgs e)
45 {
46 try
47 {
48 StringBuilder currentline = new StringBuilder()
49 //循环接收数据
50 while (port1.BytesToRead >0)
51 {
52 char ch = (char)port1.ReadByte()
53 currentline.Append(ch)
54 }
55 //在这里对接收到的数据进行处理
56 //
57 currentline = new StringBuilder()
58 }
59 catch(Exception ex)
60 {
61 Console.WriteLine(ex.Message.ToString())
62 }
63
64 }
65
66 //打开串口的方法
67 public void OpenPort()
68 {
69 try
70 {
71 port1.Open()
72 }
73 catch { }
74 if (port1.IsOpen)
75 {
76 Console.WriteLine("the port is opened!")
77 }
78 else
79 {
80 Console.WriteLine("failure to open the port!")
81 }
82 }
83
84 //关闭串口的方法
85 public void ClosePort()
86 {
87 port1.Close()
88 if (!port1.IsOpen)
89 {
90 Console.WriteLine("the port is already closed!")
91 }
92 }
93
94 //向串口发送数据
95 public void SendCommand(string CommandString)
96 {
97 byte[] WriteBuffer = Encoding.ASCII.GetBytes(CommandString)
98 port1.Write(WriteBuffer, 0, WriteBuffer.Length)
99 }
100
101 //调用实例
102 private void btnOpen_Click(object sender, RoutedEventArgs e)
103 {
104 //我现在用的COM1端口,按需要可改成COM2,COM3
105 InitCOM("COM1")
106 OpenPort()
107 }
108 }
109 }
就是要现成的了!比如:C/C++ code?
// 1.打开串行通信口,保雀宏存串口句柄
hCom=CreateFile(m_sPortParam.port,
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,// 使用重叠方式
NULL)
if(hCom==(HANDLE)INVALID_FILE_SIZE)
{
PostMessage(m_pMain->GetSafeHwnd(),WM_COMBACK_MESSAGE,0,SETCOMM_ERROR) // 报告端口打开失败
return
}
if(hCom != INVALID_HANDLE_VALUE)
{
// 设置端口
SetupComm(hCom,OUT_BUFF_SIZE,IN_BUFF_SIZE)
DCB myDCB
GetCommState(hCom, &myDCB)
myDCB.BaudRate=m_sPortParam.baud // 波特率
myDCB.fBinary=TRUE // 通信方式=二进制
myDCB.fParity=m_sPortParam.fparity // 奇偶校验 TRUE=使用,FALSE=不使用
myDCB.Parity=m_sPortParam.parity // 校验方式:0-无 1-奇 2-偶 3-标志 4-空瞎闭格
myDCB.ByteSize=m_sPortParam.bytesize // 数据位数
myDCB.StopBits=m_sPortParam.stopbits // 停止位数:0-1位 1-1.5位 2-2位
SetCommState(hCom, &myDCB)
}
else
{
// 设置失败
PostMessage(m_pMain->GetSafeHwnd(),WM_COMBACK_MESSAGE,0,SETCOMM_ERROR) // 报告端口打开失败
return
}
C/C++ code?
// 2.发送数据
Wol.hEvent=CreateEvent(NULL,// 创建事件句柄
TRUE,
FALSE,
NULL)
WriteFile(hCom,// 发送数据
&datas,
Len,
NULL,
&Wol)
C/C++ code?
// 读缓冲区并处理收到的数据
if(ReadFile(hCom,
&myByte,
Len,
NULL,
&Rol))
{
// CRC数据校验
crc=myByte[0]
if(m_sPortParam.fparity)
{
for(int k=1k<Lenk++)
crc=crc ^ myByte[k] // CRC运算
if(crc)
{
// crc检查错丢弃磨岁裂
}
Len--
}
// crc检查正确,发送数据给命令解释类
PostData(myByte,Len)
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)