假设我用CteateFile打开了一个串口,但为保存返回的句柄,怎样才能找到丢失的句柄?

假设我用CteateFile打开了一个串口,但为保存返回的句柄,怎样才能找到丢失的句柄?,第1张

function OpenCom(pComPort : Byte iBaundRate : Integer): THandle

// 打开串口

// pComPort: 串口名称或设备路径,可用"COM1"或"\\.\COM1"两种方式,建议用后者

// iBaundRate: 波特率

var

ComHdl: THandle

Dcb: TDCB

TimeOut: ComMtimeOuts //100, 1, 500, 1, 100

pTpPort: PChar

begin

pTpPort := PChar('com' + IntToStr(pComPort))

TimeOut.ReadIntervalTimeout := 100//读字符间隔携乎启超时时间: 100 ms

TimeOut.ReadTotalTimeoutMultiplier := 1 //读 *** 作时每字符的时间: 1 ms (n个字符总共为n ms)

TimeOut.ReadTotalTimeoutConstant := 500 //基本的(额外的)读超时时间: 500 ms

TimeOut.WriteTotalTimeoutMultiplier := 1//写 *** 作时每字符辩如的时间: 1 ms (n个字符总共为n ms)

TimeOut.WriteTotalTimeoutConstant := 100//基本的(额外的)写超时时间: 100 ms

ComHdl := Createfile(

pTpPort, //串口名称或设备路径

Generic_Read or Generic_Write, //读写方式

0, //共享方式:独占

nil, //认的安顷游全描述符

open_existing, //创建方式

0, //不需设置文件属性

0 //不需参照模板文件

)

if (ComHdl = Invalid_Handle_Value) then

begin

Result := ComHdl //打开串口失败

Exit

end

GetCommState(ComHdl, Dcb)//取DCB

Dcb.BaudRate := iBaundRate

Dcb.ByteSize := 8

Dcb.Parity := EvenParity

Dcb.StopBits := 1

SetCommState(ComHdl, Dcb) //设置DCB

SetUpComm(ComHdl, 4096, 1024) //设置输入输出缓冲

SetCommTimeOuts(ComHdl, TimeOut)//设置超时

Result := ComHdl

end----------------------------function CloseCom(ComHdl: THandle): Boolean

//关闭串口

begin

Result := CloseHandle(ComHdl)

end

由于linux的内核参数信息都存在内存中,因此可以通过命令直接修改,并且修改后直接生效。但是,当系统重新启动后,原来设置的参数值就会丢失,而系统每次启动时都会自动去/etc/sysctl.conf文件中读取内核参数,因此将内核的参数配置写入这个文件中,是一个比较好的选择。

首先打开/etc/sysctl.conf文件,查看如下两行的设置值,这里是:

kernel.shmall = 2097152

kernel.shmmax = 4294967295 如果系统默认的配置比这里给出的值大,就不要修改原有配置。同时在/etc/sysctl.conf文件最后,添加以下内容:

fs.file-max = 6553600

kernel.shmmni = 4096

kernel.sem = 250 32000 100 128

net.ipv4.ip_local_port_range = 1024 65000

net.core.rmem_default = 4194304

net.core.rmem_max = 4194304

net.core.wmem_default = 262144

net.core.wmem_max = 262144

这里的“fs.file-max = 6553600”其实是由“fs.file-max = 512 * processes”得到的,我们指定processes的中碧值为12800,即为“fs.file-max =512 *12800”。

sysctl.conf文件修改完毕后,接着执行“sysctl -p”使设置生效。

[root@localhost ~]# sysctl -p 常用的内核参数的含义如下。

kernel.shmmax:表示单个共享内存段的最大值,以字节卖盯举为单位,此值一般为物理内存的一半,不过大一点也没关系,这里设定的为4gb,即“4294967295/1024/1024/1024=4g”。

kernel.shmmni:表示单个共享内存段的最小值,一般为4kb,即4096bit.

kernel.shmall:表示可用共享内存的总量,单位是页,在32位系统上一页等于4kb,也就是4096字节。

fs.file-max:表示文件句柄的最大数量。文件句柄表示在linux系统中可以打开的文件数量。

ip_local_port_range:表示端口的范围,为指定的内容。

 则陪 kernel.sem:表示设置的信号量,这4个参数内容大小固定。

net.core.rmem_default:表示接收套接字缓冲区大小的缺省值(以字节为单位)。

net.core.rmem_max :表示接收套接字缓冲区大小的最大值(以字节为单位)

net.core.wmem_default:表示发送套接字缓冲区大小的缺省值(以字节为单位)。

net.core.wmem_max:表示发送套接字缓冲区大小的最大值(以字节为单位)。

[DllImport("旦灶吵辩档Coredll.dll")]

private static extern IntPtr CreateFile(String lpFileName,UInt32 dwDesiredAccess,UInt32 dwShareMode,

IntPtr lpSecurityAttributes,

UInt32 dwCreationDisposition,

UInt32 dwFlagsAndAttributes,

IntPtr hTemplateFile)

IntPtr hFile = CreateFile("CAM1:"模侍, GENERIC_READ, 0, (IntPtr)0, OPEN_EXISTING, 128, (IntPtr)0)


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

原文地址: http://outofmemory.cn/tougao/8149248.html

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

发表评论

登录后才能评论

评论列表(0条)

保存