当前位置: 首页 > news >正文

定制一个企业网站多少钱深圳保障性住房规划

定制一个企业网站多少钱,深圳保障性住房规划,dede 网站地图 调用文章,免费舆情网站串口调试 串口调试主要有 根据/proc系统信息确认串口状态#xff0c;stty命令#xff0c;编程调试 三种调试方法#xff0c;下面我们分别具体介绍下。 根据设备节点确认串口是否正常 系统上电时#xff0c;默认会使能串口#xff0c;我们可以通过dmesg | grep ttyS 查看…串口调试 串口调试主要有 根据/proc系统信息确认串口状态stty命令编程调试 三种调试方法下面我们分别具体介绍下。 根据设备节点确认串口是否正常 系统上电时默认会使能串口我们可以通过dmesg | grep ttyS 查看系统加载的串口设备。 也可以通过 cat /proc/tty/driver/serial 查看串口信息。 如果执行 echo 123 /dev/ttyS4 则会发送数据到ttyS4通过串口线将串口接到PC 串口助手确认是否收到数据。 如果此时再去查看串口设备会看到uart4 的tx 发送了5个字符。 stty 命令 stty语法 stty --helpUsage: stty [-F DEVICE] [--fileDEVICE] [SETTING]...or: stty [-F DEVICE] [--fileDEVICE] [-a|--all]or: stty [-F DEVICE] [--fileDEVICE] [-g|--save] [选项] -a, --all : 以容易阅读的方式打印当前的所有配置 -g, --save: 以stty终端可读方式打印当前的所有配置。 -F, --file: 打印当前的所有设置打开指定的设备,并用此设备作为输入来代替标准输入 [参数] 终端设置指定终端命令行的设置选项。  串口配置 stty -F /dev/ttyS0 speed 115200 cs8 -parenb -cstopb设置串口ttyS0波特率为1152008位数据位1位停止位无校验位。 查看串口属性 stty -a -F /dev/ttyS0 speed 9600 baud; rows 0; columns 0; line 0; intr ^C; quit ^\; erase ^?; kill ^U; eof ^D; eol undef; eol2 undef; swtch undef; start ^Q; stop ^S; susp ^Z; rprnt ^R; werase ^W; lnext ^V; discard ^O; min 1; time 0; -parenb -parodd -cmspar cs8 hupcl -cstopb cread clocal -crtscts -ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany -imaxbel -iutf8 opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0 isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke -flusho -extprocstty参数含义 特殊字符dsusp 字符 每当输入刷新时会发送一个用于终端阻塞信号的字符eof 字符 表示文件末尾而发送的字符(用于终止输入)eol 字符 为表示行尾而发送的字符eol2 字符 为表示行尾而发送的另一个可选字符erase 字符 擦除前一个输入文字的字符intr 字符 用于发送中断信号的字符kill 字符 用于擦除当前终端行的字符lnext 字符 用于输入下一个引用文字的字符quit 字符 用于发送退出信号的字符rprnt 字符 用于重绘当前行的字符start 字符 在停止后重新开启输出的字符stop 字符 停止输出的字符susp 字符 发送终端阻断信号的字符swtch 字符 在不同的shell 层次间切换的字符werase 字符 擦除前一个输入的单词的字符特殊设置N 设置输入输出速度为N 波特cols N 统治内核终端上有N 栏columns N 等于cols Nispeed N 设置输入速度为N 波特line N 设置行约束规则为Nmin N 和 -icanon 配合使用设置每次一完整读入的最小字符数为Nospeed N 设置输出速度为N 波特rows N 向内核通告此终端有N 行size 根据内核信息输出当前终端的行数和列数speed 输出终端速度(单位为波特)time N 和-icanon 配合使用设置读取超时为N 个十分之一秒控制设置[-]clocal 禁用调制解调器控制信号[-]cread 允许接收输入[-]crtscts 启用RTS/CTS 握手csN 设置字符大小为N 位N 的范围为5 到8[-]cstopb 每个字符使用2 位停止位 (要恢复成1 位配合-即可)[-]hup 当最后一个进程关闭标准终端后发送挂起信号[-]hupcl 等于[-]hup[-]parenb 对输出生成奇偶校验位并等待输入的奇偶校验位[-]parodd 设置校验位为奇数 (配合-则为偶数)输入设置[-]brkint 任务中断会触发中断信号[-]icrnl 将回车转换为换行符[-]ignbrk 忽略中断字符[-]igncr 忽略回车[-]ignpar 忽略含有奇偶不对称错误的字符[-]imaxbel 发出终端响铃但不刷新字符的完整输入缓冲[-]inlcr 将换行符转换为回车[-]inpck 启用输入奇偶性校验[-]istrip 剥除输入字符的高8 位比特[-]iutf8 假定输入字符都是UTF-8 编码[-]iuclc 将大写字母转换为小写[-]ixany 使得任何字符都会重启输出不仅仅是起始字符[-]ixoff 启用开始/停止字符传送[-]ixon 启用XON/XOFF 流控制[-]parmrk 标记奇偶校验错误 (结合255-0 字符序列)[-]tandem 等于[-]ixoff输出设置bsN 退格延迟的风格N 的值为0 至1crN 回车延迟的风格N 的值为0 至3ffN 换页延迟的风格N 的值为0 至1nlN 换行延迟的风格N 的值为0 至1[-]ocrnl 将回车转换为换行符[-]ofdel 使用删除字符代替空字符作填充[-]ofill 延迟时使用字符填充代替定时器同步[-]olcuc 转换小写字母为大写[-]onlcr 将换行符转换为回车[-]onlret 使得换行符的行为表现和回车相同[-]onocr 不在第一列输出回车[-]opost 后续进程输出tabN 水平制表符延迟的风格N 的值为0 至3tabs 等于tab0-tabs 等于tab3vtN 垂直制表符延迟的风格N 的值为0 至1本地设置[-]crterase 擦除字符回显为退格符crtkill 依照echoprt 和echoe 的设置清除所有行-crtkill 依照echoctl 和echol 的设置清除所有行[-]ctlecho 在头字符中输出控制符号(^c)[-]echo 回显输入字符[-]echoctl 等于[-]ctlecho[-]echoe 等于[-]crterase[-]echok 在每清除一个字符后输出一次换行[-]echoke 等于[-]crtkill 意义相同[-]echonl 即使没有回显任何其它字符也输出换行[-]echoprt 在\和/之间向后显示擦除的字符[-]icanon 启用erase、kill、werase 和rprnt 等特殊字符[-]iexten 允许POSIX 标准以外的特殊字符[-]isig 启用interrupt、quit和suspend 等特殊字符[-]noflsh 在interrupt 和 quit 特殊字符后禁止刷新[-]prterase 等于[-]echoprt[-]tostop 中止尝试向终端写入数据的后台任务[-]xcase 和icanon 配合使用用转义符\退出大写状态综合设置[-]LCASE 等于[-]lcasecbreak 等于-icanon-cbreak 等于icanoncooked 等于brkint ignpar istrip icrnl ixon opost isig icanon eof eol 等的默认值-cooked 等于-rawcrt 等于echoe echoctl echokedec 等于echoe echoctl echoke -ixany intr ^c erase 0177 kill ^u[-]decctlq 等于[-]ixanyek 清除所有字符将它们回溯为默认值evenp 等于parenb -parodd cs7-evenp 等于-parenb cs8[-]lcase 等于xcase iuclc olcuclitout 等于-parenb -istrip -opost cs8-litout 等于parenb istrip opost cs7nl 等于-icrnl -onlcr-nl 等于icrnl -inlcr -igncr onlcr -ocrnl -onlretoddp 等于parenb parodd cs7-oddp 等于-parenb cs8[-]parity 等于[-]evenppass8 等于-parenb -istrip cs8-pass8 等于parenb istrip cs7raw 等于-ignbrk -brkint -ignpar -parmrk -inpck -istrip-inlcr -igncr -icrnl -ixon -ixoff -iuclc -ixany-imaxbel -opost -isig -icanon -xcase min 1 time 0-raw 等于cookedsane 等于cread -ignbrk brkint -inlcr -igncr icrnl -iutf8-ixoff -iuclc -ixany imaxbel opost -olcuc -ocrnl onlcr-onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0isig icanon iexten echo echoe echok -echonl -noflsh-xcase -tostop -echoprt echoctl echoke所有特殊字符均使用默认值串口编程调试 串口相关操作 在Linux下除了网络设备其余的都是文件的形式串口设备也一样在/dev下。 打开串口 示例 fd open(/dev/ttyUSB0,O_RDWR|O_NOCTTY|O_NDELAY);在打开串口时除了需要用到 O_RDWR (可读写)选项标志外 O_NOCTTY告诉 Linux “本程序不作为串口的‘控制终端’”。如果不使用该选项会有一些输入字符影响进程运行如一些产生中断信号的键盘输入字符等。 O_NDELAY标志则是告诉Linux,这个程序并不关心DCD信号线的状态——也就是不关心端口另一端是否已经连接。 关闭串口 close(fd)读写串口 与普通文件一样使用readwrite函数。 示例 read(fd,buff,8); write(fd,buff,8);串口属性设置 很多系统都支持POSIX终端(串口)接口.程序可以利用这个接口来改变终端的参数,比如,波特率,字符大小等等.要使用这个端口的话,你必须将termios.h头文件包含到你的程序中。这个头文件中定义了终端控制结构体和POSIX控制函数。 termios 结构体 struct termios {tcflag_t c_cflag    / 控制标志tcflag_t c_iflag;   / 输入标志tcflag_t c_oflag;   / 输出标志tcflag_t c_lflag;   / 本地标志tcflag_t c_cc[NCCS]; / 控制字符 }其中我们更关注的是c_cflag控制选项。其中包含了波特率、数据位、校验位、停止位的设置。 c_cflag 控制标志常量 CBAUD   (不属于 POSIX) 波特率掩码 (41 位)。CBAUDEX  (不属于 POSIX) 扩展的波特率掩码 (1 位)包含在 CBAUD 中。(POSIX 规定波特率存储在 termios 结构中并未精确指定它的位置而是提供了函数 cfgetispeed() 和 cfsetispeed() 来存取它。一些系统使用 c_cflag 中 CBAUD 选择的位其他系统使用单独的变量例如 sg_ispeed 和 sg_ospeed 。)CSIZE   字符长度掩码。取值为 CS5, CS6, CS7, 或 CS8。CSTOPB 设置两个停止位而不是一个。CREAD 打开接受者。PARENB  允许输出产生奇偶信息以及输入的奇偶校验。PARODD 输入和输出是奇校验。HUPCL   在最后一个进程关闭设备后降低 modem 控制线 (挂断)。(?)CLOCAL 忽略 modem 控制线。LOBLK   (不属于 POSIX) 从非当前 shell 层阻塞输出(用于 shl )。(?)CIBAUD (不属于 POSIX) 输入速度的掩码。CIBAUD 各位的值与 CBAUD 各位相同左移了 IBSHIFT 位。CRTSCTS  (不属于 POSIX) 启用 RTS/CTS (硬件) 流控制。 c_iflag 输入标志常量 IGNBRK   忽略输入中的 BREAK 状态。BRKINT   如果设置了 IGNBRK将忽略 BREAK。如果没有设置但是设置了 BRKINT那么 BREAK 将使得输入和输出队列被刷新如果终端是一个前台进程组的控制终端这个进程组中所有进程将收到 SIGINT 信号。如果既未设置 IGNBRK 也未设置 BRKINTBREAK 将视为与 NUL 字符同义除非设置了 PARMRK这种情况下它被视为序列 \377 \0 \0。IGNPAR   忽略桢错误和奇偶校验错。PARMRK  如果没有设置 IGNPAR在有奇偶校验错或桢错误的字符前插入 \377 \0。如果既没有设置 IGNPAR 也没有设PARMRK将有奇偶校验错或桢错误的字符视为 \0。INPCK   启用输入奇偶检测。ISTRIP  去掉第八位。INLCR   将输入中的 NL 翻译为 CR。IGNCR   忽略输入中的回车。ICRNL   将输入中的回车翻译为新行 (除非设置了 IGNCR)。IUCLC   (不属于 POSIX) 将输入中的大写字母映射为小写字母。IXON    启用输出的 XON/XOFF 流控制。IXANY  (不属于 POSIX.1XSI) 允许任何字符来重新开始输出。(?)IXOFF  启用输入的 XON/XOFF 流控制。IMAXBEL (不属于 POSIX) 当输入队列满时响零。Linux 没有实现这一位总是将它视为已设置。 c_oflag 输出标志常量 OPOST   启用具体实现自行定义的输出处理。其余 c_oflag 标志常量定义在 POSIX 1003.1-2001 中除非另外说明。OLCUC   (不属于 POSIX) 将输出中的小写字母映射为大写字母。ONLCR   (XSI) 将输出中的新行符映射为回车-换行。OCRNL   将输出中的回车映射为新行符ONOCR 不在第 0 列输出回车。ONLRET 不输出回车。OFILL 发送填充字符作为延时而不是使用定时来延时。OFDEL   (不属于 POSIX) 填充字符是 ASCII DEL (0177)。如果不设置填充字符则是 ASCII NUL。NLDLY   新行延时掩码。取值为 NL0 和 NL1。CRDLY   回车延时掩码。取值为 CR0, CR1, CR2, 或 CR3。TABDLY  水平跳格延时掩码。取值为 TAB0, TAB1, TAB2, TAB3 (或 XTABS)。取值为 TAB3即 XTABS将扩展跳格为空格 (每个跳格符填充 8 个空格)。(?)BSDLY   回退延时掩码。取值为 BS0 或 BS1。(从来没有被实现过)VTDLY   竖直跳格延时掩码。取值为 VT0 或 VT1。FFDLY   进表延时掩码。取值为 FF0 或 FF1。 c_lflag 本地标志常量 ISIG    当接受到字符 INTR, QUIT, SUSP, 或 DSUSP 时产生相应的信号。ICANON   启用标准模式 (canonical mode)。允许使用特殊字符 EOF, EOL, EOL2, ERASE, KILL, LNEXT, REPRINT, STATUS, 和 WERASE以及按行的缓冲。XCASE   (不属于 POSIX; Linux 下不被支持) 如果同时设置了 ICANON终端只有大写。输入被转换为小写除了以 \ 前缀的字符。输出时大写字符被前缀 \小写字符被转换成大写。ECHO    回显输入字符。ECHOE  如果同时设置了 ICANON字符 ERASE 擦除前一个输入字符WERASE 擦除前一个词。ECHOK  如果同时设置了 ICANON字符 KILL 删除当前行。ECHONL  如果同时设置了 ICANON回显字符 NL即使没有设置 ECHO。ECHOCTL (不属于 POSIX) 如果同时设置了 ECHO除了 TAB, NL, START, 和 STOP 之外的 ASCII 控制信号被回显为 ^X, 这里 X 是比控制信号大 0x40 的 ASCII 码。例如字符 0x08 (BS) 被回显为 ^H。ECHOPRT (不属于 POSIX) 如果同时设置了 ICANON 和 IECHO字符在删除的同时被打印。ECHOKE   (不属于 POSIX) 如果同时设置了 ICANON回显 KILL 时将删除一行中的每个字符如同指定了 ECHOE 和 ECHOPRT 一样。DEFECHO (不属于 POSIX) 只在一个进程读的时候回显。FLUSHO   (不属于 POSIX; Linux 下不被支持) 输出被刷新。这个标志可以通过键入字符 DISCARD 来开关。NOFLSH   禁止在产生 SIGINT, SIGQUIT 和 SIGSUSP 信号时刷新输入和输出队列。TOSTOP   向试图写控制终端的后台进程组发送 SIGTTOU 信号。IEXTEN   启用实现自定义的输入处理。这个标志必须与ICANON 同时使用才能解释特殊字符 EOL2LNEXTREPRINT 和 WERASEIUCLC 标志才有效。 c_cc 特殊的控制字符 VINTR   (003, ETX, Ctrl-C, or also 0177, DEL, rubout) 中断字符。发出 SIGINT 信号。当设置 ISIG 时可被识别不再作为输入传递。VQUIT   (034, FS, Ctrl-) 退出字符。发出 SIGQUIT 信号。当设置 ISIG 时可被识别不再作为输入传递。VERASE  (0177, DEL, rubout, or 010, BS, Ctrl-H, or also #) 删除字符。删除上一个还没有删掉的字符但不删除上一个 EOF 或行首。当设置 ICANON 时可被识别不再作为输入传递。VKILL   (025, NAK, Ctrl-U, or Ctrl-X, or also ) 终止字符。删除自上一个 EOF 或行首以来的输入。当设置 ICANON 时可被识别不再作为输入传递。VEOF   (004, EOT, Ctrl-D) 文件尾字符。更精确地说这个字符使得 tty 缓冲中的内容被送到等待输入的用户程序中而不必等到 EOL。如果它是一行的第一个字符那么用户程序的 read() 将返回 0指示读到了 EOF。当设置 ICANON 时可被识别不再作为输入传递。VMIN   非 canonical 模式读的最小字符数。VEOL   (0, NUL) 附加的行尾字符。当设置 ICANON 时可被识别。VTIME  非 canonical 模式读时的延时以十分之一秒为单位。VEOL2  (not in POSIX; 0, NUL) 另一个行尾字符。当设置 ICANON 时可被识别。VSWTCH (not in POSIX; not supported under Linux; 0, NUL) 开关字符。(只为 shl 所用。)VSTART (021, DC1, Ctrl-Q) 开始字符。重新开始被 Stop 字符中止的输出。当设置 IXON 时可被识别不再作为输入传递。VSTOP   (023, DC3, Ctrl-S) 停止字符。停止输出直到键入 Start 字符。当设置 IXON 时可被识别不再作为输入传递。VSUSP   (032, SUB, Ctrl-Z) 挂起字符。发送 SIGTSTP 信号。当设置 ISIG 时可被识别不再作为输入传递。VDSUSP (not in POSIX; not supported under Linux; 031, EM, Ctrl-Y) 延时挂起信号。当用户程序读到这个字符时发送 SIGTSTP 信号。当设置 IEXTEN 和 ISIG并且系统支持作业管理时可被识别不再作为输入传递。VLNEXT  (not in POSIX; 026, SYN, Ctrl-V) 字面上的下一个。引用下一个输入字符取消它的任何特殊含义。当设置 IEXTEN 时可被识别不再作为输入传递。VWERASE (not in POSIX; 027, ETB, Ctrl-W) 删除词。当设置 ICANON 和 IEXTEN 时可被识别不再作为输入传递。VREPRINT (not in POSIX; 022, DC2, Ctrl-R) 重新输出未读的字符。当设置 ICANON 和 IEXTEN 时可被识别不再作为输入传递。VDISCARD  (not in POSIX; not supported under Linux; 017, SI, Ctrl-O) 开关开始/结束丢弃未完成的输出。当设置 IEXTEN 时可被识别不再作为输入传递。 调用read 函数读取串口数据时 返回读取数据的数量需要考虑两个变量 MIN 和 TIME 。 MIN 和 TIME 在 termios 结构的 c_cc 成员的数组 下标名为 VMIN 和 VTIME 。MIN是指一次 read 调用期望返回的最小字节数 。 VTIME 说明等待数据到达的分秒数秒的 1/10 为分秒 。 TIME 与 MIN 组合使用的 具体含义分 为 以下四种情形 当 MIN 0 TIME 0 时计时器在收到第一个字节后启动在计时器超时之前 TIME 的时间到 若已收到 MIN个字节则 read 返回 MIN 个字节否则在计时器超时后返回实际接收到的字节。注意因为只有在接收到第一个字节时才开始计时所以至少可以返回1个字节。这种情形中在接到第一个字节之前调用者阻塞。如果在调用read时数据已经可用则如同在read后数据立即被接到一样。 当 MIN 0 TIME 0 时MIN个字节完整接收后 read 才返回这可能会造成 read 无限期地阻塞。 当 MIN 0, TIME 0 时TIME为允许等待的最大时间计 时器在调用 read 时立即启动在串口接到 1 字节数据或者计时器超时后即返回如果是计时器超时则返回 0 。 当 MIN 0 TIME 0 时如果有数据可用则read 最多返回所要求的字节数如果无数据可用则 read 立即返回 0 。 终端api函数接口 tcgetattr tcgetattr() 得到与 fd 指向的对象相关的参数将它们保存于 termios_p 引用的 termios 结构中。函数可以从后台进程中调用但是终端属性可能被后来的前台进程所改变。 tcsetattr tcsetattr() 设置与终端相关的参数 (除非需要底层支持却无法满足)使用 termios_p 引用的 termios 结构。optional_actions 指定了什么时候改变会起作用 TCSANOW   改变立即发生TCSADRAIN   改变在所有写入 fd 的输出都被传输后生效。这个函数应当用于修改影响输出的参数时使用。TCSAFLUSH  改变在所有写入 fd 引用的对象的输出都被传输后生效所有已接受但未读入的输入都在改变发生前丢弃。 tcsendbreak tcsendbreak() 传送连续的 0 值比特流持续一段时间如果终端使用异步串行数据传输的话。如果 duration 是 0它至少传输 0.25 秒不会超过 0.5 秒。如果 duration 非零它发送的时间长度由实现定义。如果终端并非使用异步串行数据传输tcsendbreak() 什么都不做。 tcdrain tcdrain() 等待直到所有写入 fd 引用的对象的输出都被传输。 tcflush tcflush() 丢弃要写入 引用的对象但是尚未传输的数据或者收到但是尚未读取的数据取决于 queue_selector 的值 TCIFLUSH   刷新收到的数据但是不读TCOFLUSH 刷新写入的数据但是不传送TCIOFLUSH  同时刷新收到的数据但是不读并且刷新写入的数据但是不传送 tcflow tcflow() 挂起 fd 引用的对象上的数据传输或接收取决于 action 的值 TCOOFF   挂起输出、TCOON    重新开始被挂起的输出TCIOFF   发送一个 STOP 字符停止终端设备向系统传送数据TCION    发送一个 START 字符使终端设备向系统传输数据 串口属性设置示例 设置串口属性主要是配置termios结构体中的各个变量大致流程如下 使用函数tcgetattr保存原串口属性 struct termios newtio,oldtio; tcgetattr(fd,oldtio);通过位掩码的方式激活本地连接和接受使能选项CLOCAL和CREAD newtio.c_cflag | CLOCAL | CREAD;使用函数cfsetispeed和cfsetospeed设置数据传输率 cfsetispeed(newtio,B115200); cfsetospeed(newtio,B115200);通过位掩码设置字符大小。 newtio.c_cflag ~CSIZE; newtio.c_cflag | CS8;设置奇偶效验位需要用到两个termios中的成员c_cflag和c_iflag。首先要激活c_cflag中的校验位使能标志PARENB和是否进行奇偶效验同时还要激活c_iflag中的奇偶效验使能。 设置奇校验: newtio.c_cflag | PARENB; newtio.c_cflag | PARODD; newtio.c_iflag | (INPCK | ISTRIP); 设置偶校验: newtio.c_iflag | (INPCKISTRIP); newtio.c_cflag | PARENB; newtio.c_cflag | ~PARODD;激活c_cflag中的CSTOPB设置停止位。若停止位为1则清除CSTOPB若停止位为0则激活CSTOPB。 newtio.c_cflag ~CSTOPB;设置最少字符和等待时间。在对接收字符和等待时间没有特别要求的情况下可以将其设置为0。 newtio.c_cc[VTIME] 0; newtio.c_cc[VMIN] 0;调用函数”tcflush(fd,queue_selector)”来处理要写入引用的对象queue_selector可能的取值有以下几种。 TCIFLUSH:刷新收到的数据但是不读TCOFLUSH:刷新写入的数据但是不传送TCIOFLUSH:同时刷新收到的数据但是不读并且刷新写入的数据但是不传送。 激活配置。在完成配置后需要激活配置使其生效。使用tcsetattr()函数。 int tcsetattr(int filedes,int opt,const struct termios termptr);串口编程实例 /file main.cbrief 串口应用编程测试detailsauthor zhongyi date 2022-04-30version V1.0// 包含的头文件 / #include stdio.h //标准输入输出,如printf、scanf以及文件操作 #include stdlib.h //标准库头文件定义了五种类型、一些宏和通用工具函数 #include unistd.h //定义 read write close lseek 等Unix标准函数 #include sys/types.h //定义数据类型如 ssiz e_t off_t 等 #include sys/stat.h //文件状态 #include fcntl.h //文件控制定义 #include termios.h //终端I/O #include errno.h //与全局变量 errno 相关的定义 #include getopt.h //处理命令行参数 #include string.h //字符串操作 #include time.h //时间 #include sys/select.h //select函数#define DEV_NAME /dev/ttyS4 /// 串口设备/brief 设置串口参数波特率数据位停止位和效验位param[in] fd 类型 int 打开的串口文件句柄param[in] nSpeed 类型 int 波特率param[in] nBits 类型 int 数据位 取值 为 7 或者8param[in] nParity 类型 int 停止位 取值为 1 或者2param[in] nStop 类型 int 效验类型 取值为N,E,O,,Sreturn 返回设置结果- 0 设置成功- -1 设置失败/ int setOpt(int fd, int nSpeed, int nBits, int nParity, int nStop) {struct termios newtio, oldtio;// 保存测试现有串口参数设置在这里如果串口号等出错会有相关的出错信息if (tcgetattr(fd, oldtio) ! 0){perror(SetupSerial 1);return -1;}bzero(newtio, sizeof(newtio)); //新termios参数清零newtio.c_cflag | CLOCAL | CREAD; //CLOCAL--忽略 modem 控制线,本地连线, 不具数据机控制功能, CREAD--使能接收标志// 设置数据位数newtio.c_cflag ~CSIZE; //清数据位标志switch (nBits){case 7:newtio.c_cflag | CS7;break;case 8:newtio.c_cflag | CS8;break;default:fprintf(stderr, Unsupported data size\n);return -1;}// 设置校验位switch (nParity){case o:case O: //奇校验newtio.c_cflag | PARENB;newtio.c_cflag | PARODD;newtio.c_iflag | (INPCK | ISTRIP);break;case e:case E: //偶校验newtio.c_iflag | (INPCK | ISTRIP);newtio.c_cflag | PARENB;newtio.c_cflag ~PARODD;break;case n:case N: //无校验newtio.c_cflag ~PARENB;break;default:fprintf(stderr, Unsupported parity\n);return -1;}// 设置停止位switch (nStop){case 1:newtio.c_cflag ~CSTOPB;break;case 2:newtio.c_cflag | CSTOPB;break;default:fprintf(stderr,Unsupported stop bits\n);return -1;}// 设置波特率 2400/4800/9600/19200/38400/57600/115200/230400switch (nSpeed){case 2400:cfsetispeed(newtio, B2400);cfsetospeed(newtio, B2400);break;case 4800:cfsetispeed(newtio, B4800);cfsetospeed(newtio, B4800);break;case 9600:cfsetispeed(newtio, B9600);cfsetospeed(newtio, B9600);break;case 19200:cfsetispeed(newtio, B19200);cfsetospeed(newtio, B19200);break;case 38400:cfsetispeed(newtio, B38400);cfsetospeed(newtio, B38400);break;case 57600:cfsetispeed(newtio, B57600);cfsetospeed(newtio, B57600);break;case 115200:cfsetispeed(newtio, B115200);cfsetospeed(newtio, B115200);break;case 230400:cfsetispeed(newtio, B230400);cfsetospeed(newtio, B230400);break;default:printf(\tSorry, Unsupported baud rate, set default 9600!\n\n);cfsetispeed(newtio, B9600);cfsetospeed(newtio, B9600);break;}// 设置read读取最小字节数和超时时间newtio.c_cc[VTIME] 1; // 读取一个字符等待1(1/10)snewtio.c_cc[VMIN] 1; // 读取字符的最少个数为1tcflush(fd,TCIFLUSH); //清空缓冲区if (tcsetattr(fd, TCSANOW, newtio) ! 0) //激活新设置{perror(SetupSerial 3);return -1;}printf(Serial set done!\n);return 0; }/brief 串口读取函数param[in] fd 打开的串口文件句柄param[in] rcv_buf 接收缓存指针param[in] data_len 要读取数据长度param[in] timeout 接收等待超时时间单位msreturn 返回设置结果- 0 设置成功- 其他 读取超时或错误/ int UART_Recv(int fd, char rcv_buf, int data_len, int timeout) {int len, fs_sel;fd_set fs_read;struct timeval time;time.tv_sec timeout / 1000; //set the rcv wait timetime.tv_usec timeout % 1000 1000; //100000us 0.1sFD_ZERO(fs_read); //每次循环都要清空集合否则不能检测描述符变化FD_SET(fd, fs_read); //添加描述符// 超时等待读变化0就绪描述字的正数目 -1出错 0 超时fs_sel select(fd 1, fs_read, NULL, NULL, time); // printf(fs_sel %d\n, fs_sel);if(fs_sel){len read(fd, rcv_buf, data_len);return len;}else{ // printf(Sorry,I am wrong!);return -1;} }/brief 串口发送函数param[in] fd 打开的串口文件句柄param[in] send_buf 发送数据指针param[in] data_len 发送数据长度return 返回结果- data_len 成功- -1 失败/ int UART_Send(int fd, char send_buf, int data_len) {ssize_t ret 0;ret write(fd, send_buf, data_len);if (ret data_len){printf(send data is %s\n, send_buf);return ret;}else{printf(write device error\n);tcflush(fd,TCOFLUSH);return -1;} }/fn mainbrief main入口函数/ int main (int argc, char argv[]) {int fdSerial;// 打开串口设备fdSerial open(DEV_NAME, O_RDWR | O_NOCTTY | O_NDELAY);if(fdSerial 0){perror(DEV_NAME);return -1;}// 设置串口阻塞 0阻塞 FNDELAY非阻塞if (fcntl(fdSerial, F_SETFL, 0) 0) //阻塞即使前面在open串口设备时设置的是非阻塞的{printf(fcntl failed!\n);}else{printf(fcntl%d\n, fcntl(fdSerial, F_SETFL, 0));}if (isatty(fdSerial) 0){printf(standard input is not a terminal device\n);close(fdSerial);return -1;}else{printf(is a tty success!\n);}printf(fd-open%d\n, fdSerial);// 设置串口参数if (setOpt(fdSerial, 115200, 8, N, 1) -1) //设置8位数据位、1位停止位、无校验{fprintf(stderr, Set opt Error\n);close(fdSerial);exit(1);}tcflush(fdSerial, TCIOFLUSH); //清掉串口缓存fcntl(fdSerial, F_SETFL, 0); //串口阻塞char rcv_buf[100];int len;while(1) //循环读取数据{len UART_Recv(fdSerial, rcv_buf, 99, 10000);if(len 0){rcv_buf[len] \0;printf(receive data is %s\n, rcv_buf);printf(len %d\n, len);UART_Send(fdSerial, rcv_buf, len);}else{ // printf(cannot receive data\n);}usleep(100000); //休眠100ms} }本文参考 https://blog.csdn.net/luotuo28/article/details/125896180 https://www.cnblogs.com/silencehuan/p/11103074.html
http://www.zqtcl.cn/news/973320/

相关文章:

  • 光泽县规划建设局网站番禺做哪些做网站的
  • 海南响应式网站建设哪里好衡水哪儿做wap网站
  • 月熊志网站百度网页版
  • 三亚网站建设方案鱼爪商标交易平台
  • phpwind 手机网站模板建立网站的英文短语
  • 年度网站建设工作总结制作微信小程序需要什么技术
  • wordpress打字不显示图片wordpress 访问优化
  • 太原网站建设方案咨询网站开发公司的选择
  • 广西网站建设设计大连嘉良建设有限公司网站
  • 白名单查询网站网站建设改变某个表格大小
  • 青岛网站开发公司电话百度投放
  • 唐山玉田孤树做宣传上什么网站百度推广有效果吗
  • 亚马逊网站特点佛山营销型网页设计
  • 网站建设 长沙开福区做百度移动网站排名软
  • 广州购物网站建设在线解压网站
  • 网站建设教学方法探究购物网站开发中查看订单的实现逻辑
  • 网站建设漂亮的模板西安网络优化大的公司
  • 如何免费简单建一个网站河北优化网站获客qq
  • 如何给网站做seo东莞网站建设星河
  • 什么叫门户类网站哪个网站能帮助做路书
  • 网站建站基础娄底网站推广
  • WordPress网站仿制光明建网站的公司
  • 可以做企业网站昆明seo怎么做
  • 西安那里做网站媒体软文发稿
  • 怎样做网站呢wordpress首页幻灯片尺寸
  • 青岛即墨网站网页设计营销型网站规划建设的七大要素
  • WordPress建站经验固原市住房和城乡建设厅网站
  • 可以查企业信息的软件wordpress换模板 seo
  • 网站广告怎么做wordpress封面图七牛
  • 设计师网站上海建设银行内部网站6