使用MFC(单文档)编的串口通信程序,编译时没有错误,最后执行时,总是提示“建立空文档失败”

使用MFC(单文档)编的串口通信程序,编译时没有错误,最后执行时,总是提示“建立空文档失败”,第1张

//m_MSComm.GetInput()//先预读缓则携颤冲区,以清除残留数据

应该是有返回值的吧,有返回值的话,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)

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11973250.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存